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
}
}
答案 0 :(得分: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.
答案 1 :(得分:1)
来自Assembly.GetType
的文件:
此方法仅搜索当前程序集实例。 name参数包括命名空间,但不包括程序集。
说完之后会提供给定类型的FullName
:
Type type = typeof(MyType);
Type copy = type.Assembly.GetType(type.FullName);
答案 2 :(得分:0)
您需要指定类型的FullName
:
var copy = type.Assembly.GetType(type.FullName)