gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:15 24 4
gpt4 key购买 nike

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;

如果这是预期的行为,谁能解释为什么会这样?

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


super 简单的演示:

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

关于c# - 为什么 type.Assembly.GetType(type.Name) 返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31648182/

24 4 0