我刚刚注意到函数中有一个错误:
Type.GetType("System.Uri");
返回值为 null 而以下函数运行良好...
Type.GetType("System.string");
Type.GetType("System.bool");
Type.GetType("System.DateTime");
...
任何人都知道,为什么返回的类型为空?
编辑:删除了 Uri 双重输入...
Type.GetType("System.Uri")
返回的原因null
是该类型位于system.dll而不是mscorlib.dll中。您必须使用上述程序集限定名称。
来自 MSDN:
typeName 类型:System.String
要获取的类型的程序集限定名称。请参阅 AssemblyQualifiedName。如果该类型在当前执行的程序集中或在 Mscorlib.dll 中,则提供由其命名空间限定的类型名称就足够了。
我也遇到了这个问题,并意识到,尤其是在使用 JIT 编译的 ASP.Net 中,我并不总是知道程序集信息。我将以下内容添加到我的 ReflectionUtilities 类中。在某种程度上,它是一个“破解坚果的大锤”,但它同时适用于 AssemblyQualifiedName 和基本类 FullName。第一个基本上缩短了对必须发生的 CurrentDomainAssemblies 的搜索。
public static Type FindType(string qualifiedTypeName)
{
Type t = Type.GetType(qualifiedTypeName);
if (t != null)
{
return t;
}
else
{
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
{
t = asm.GetType(qualifiedTypeName);
if (t != null)
return t;
}
return null;
}
}
注意:考虑到反射性能问题,如果可能的话,不应该在没有组装资格的情况下在循环内部调用它。最好访问您需要的第一个项目,从中提取装配信息,然后从那里继续。并不总是合适但效率更高(如果反射中的任何东西都可以称为高效:-))。
阿利斯泰尔
试试这个代码:
Uri uri = new Uri("http://test");
Type t = Type.GetType(uri.GetType().AssemblyQualifiedName);
然后你可以从类型中复制/粘贴 AssemblyQualifiedName
另一种方法是:
Type t = typeof(Uri);
获取具有指定名称的 Type,执行区分大小写的搜索。
返回值
类型:System.Type
具有指定名称的类型(如果找到);否则为空。
所以,如果你打错了,你的类型将不会被找到并且null
会被返回。这不是错误。
如果没有其他信息,我猜您没有使用完全限定的类型名称。Type.GetType()
不仅需要完全限定的类型名称(ie System.String
),还需要程序集限定名称,以防您尝试加载当前正在执行的程序集类型以外的任何内容。