8

我刚刚注意到函数中有一个错误:

Type.GetType("System.Uri");

返回值为 null 而以下函数运行良好...

Type.GetType("System.string");
Type.GetType("System.bool");
Type.GetType("System.DateTime");

...

任何人都知道,为什么返回的类型为空?

编辑:删除了 Uri 双重输入...

4

5 回答 5

16

Type.GetType("System.Uri")返回的原因null是该类型位于system.dll而不是mscorlib.dll中。您必须使用上述程序集限定名称。

来自 MSDN:

typeName 类型:System.String

要获取的类型的程序集限定名称。请参阅 AssemblyQualifiedName。如果该类型在当前执行的程序集中或在 Mscorlib.dll 中,则提供由其命名空间限定的类型名称就足够了。

于 2012-10-15T15:10:00.460 回答
13

我也遇到了这个问题,并意识到,尤其是在使用 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;
        }
    }

注意:考虑到反射性能问题,如果可能的话,不应该在没有组装资格的情况下在循环内部调用它。最好访问您需要的第一个项目,从中提取装配信息,然后从那里继续。并不总是合适但效率更高(如果反射中的任何东西都可以称为高效:-))。

阿利斯泰尔

于 2013-05-15T20:42:57.793 回答
3

试试这个代码:

Uri uri = new Uri("http://test");
Type t = Type.GetType(uri.GetType().AssemblyQualifiedName);

然后你可以从类型中复制/粘贴 AssemblyQualifiedName

另一种方法是:

Type t = typeof(Uri);
于 2012-10-15T15:02:25.257 回答
1

Type.GetType(String)

获取具有指定名称的 Type,执行区分大小写的搜索。

返回值

类型:System.Type

具有指定名称的类型(如果找到);否则为空。

所以,如果你打错了,你的类型将不会被找到并且null会被返回。这不是错误。

于 2012-10-15T14:57:49.563 回答
1

如果没有其他信息,我猜您没有使用完全限定的类型名称。Type.GetType()不仅需要完全限定的类型名称(ie System.String),还需要程序集限定名称,以防您尝试加载当前正在执行的程序集类型以外的任何内容。

于 2012-10-15T14:58:31.817 回答