我刚注意到函数中的一个错误:
Type.GetType("System.Uri");
返回值为null,而以下函数运行良好......
Type.GetType("System.string");
Type.GetType("System.bool");
Type.GetType("System.DateTime");
...
任何人都知道,为什么返回的Type为null?
编辑:删除了Uri双重录入......
答案 0 :(得分:15)
Type.GetType("System.Uri")
返回null
的原因是该类型位于 system.dll 而不是 mscorlib.dll 。您必须使用上面提到的程序集限定名称。
来自MSDN:
的typeName 键入:System.String
要获取的类型的程序集限定名称。请参阅AssemblyQualifiedName。 如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。
答案 1 :(得分:10)
我也遇到了这个问题,并意识到,特别是在使用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;
}
}
注意:鉴于Reflection性能问题,如果没有可能的话,不应在没有程序集限定的情况下调用内部循环。最好访问您需要的第一个项目,从中提取装配信息,然后从那里开始。并不总是合适但效率更高(如果反射中的任何内容都可以称为高效: - ))。
阿利斯泰尔
答案 2 :(得分:2)
试试这段代码:
Uri uri = new Uri("http://test");
Type t = Type.GetType(uri.GetType().AssemblyQualifiedName);
然后你可以从类型
复制/粘贴AssemblyQualifiedName另一种方法是:
Type t = typeof(Uri);
答案 3 :(得分:1)
获取具有指定名称的Type,执行区分大小写的搜索。
返回值
输入:System.Type
具有指定名称的类型(如果找到);否则,null。
因此,如果您输入拼写错误,则无法找到您的类型,并且会返回null
。这不是一个错误。
答案 4 :(得分:1)
如果没有其他信息,我猜您没有使用完全限定的类型名称。 Type.GetType()
不仅需要完全限定的类型名称(即System.String
),还需要assembly-qualified name,以防您尝试加载除当前正在执行的程序集类型之外的任何内容。