为什么type.Assembly.GetType(type.Name)返回null?

Ste*_*ven 1 c#

Type type = typeof(MyType);
Type copy = type.Assembly.GetType(type.Name);
Run Code Online (Sandbox Code Playgroud)

对我来说,上面的代码最终应该copy是对同一个对象的另一个引用,这似乎微不足道type.但是,我一直在努力copy == null.如果我使用过载Assembly.GetType(type.Name, true)它会抛出一个TypeLoadException.

这种类型的组件找不到这种类型是不是很奇怪?它肯定在那里!以下是真实的:

type.Assembly.GetTypes()[0] == type;
type.Assembly.GetExportedTypes()[0] == type;
Run Code Online (Sandbox Code Playgroud)

如果这是预期的行为,有人可以解释为什么这样吗?

如果不是,有人能指出任何可能导致这种情况发生的事情吗?


超级简单的演示:

public class Program
{
    static void Main(string[] args)
    {
        var type = typeof(Program);
        Console.WriteLine(type.Assembly.GetExportedTypes()[0] == type); // True
        Console.WriteLine(type.Assembly.GetType(type.Name, true)); // exception
    }
}
Run Code Online (Sandbox Code Playgroud)

Lua*_*aan 6

Type.Name 不足以识别类型.

例如,typeof(string).Name会给你String- 但没有命名空间.

要获取包含命名空间的完整类型名称,您需要使用Type.FullName.如果您还关心不同的组件,那么完全限定的名称是最好的 - Type.AssemblyQualifiedName.

使用的几个例子Type.GetType:

var a = Type.GetType("String"); // Returns null - not enough information to find the type
var b = Type.GetType("System.String"); // typeof(string), because mscorlib is loaded
var c = Type.GetType("System.Windows.Forms.Form, System.Windows.Forms");
        // Works even when System.Windows.Forms isn't loaded

var d = Type.GetType("System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
        // Also checks for proper version and signature. 
        // This is System.Windows.Forms from Microsoft.
Run Code Online (Sandbox Code Playgroud)