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

本文关键字:type 返回 null Assembly GetType 为什么 Name | 更新日期: 2023-09-27 18:04:54

Type type = typeof(MyType);
Type copy = type.Assembly.GetType(type.Name);

对我来说,上面的代码应该以copy作为type对同一对象的另一个引用而告终。然而,我一直得到copy == null。如果我使用重载Assembly.GetType(type.Name, true),它会抛出一个TypeLoadException

类型的汇编找不到这个类型是不是很奇怪?但它肯定在里面!

type.Assembly.GetTypes()[0] == type;
type.Assembly.GetExportedTypes()[0] == type;

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

如果不是,谁能告诉我可能导致这种情况发生的原因?


超级简单的演示:

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
    }
}

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

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.

来自Assembly.GetType的文档:

此方法仅搜索当前程序集实例。name参数包括名称空间,但不包括程序集。

提供给定类型的FullName:

Type type = typeof(MyType);
Type copy = type.Assembly.GetType(type.FullName);

您需要指定您的类型的FullName:

var copy = type.Assembly.GetType(type.FullName)