Type.GetType无效

时间:2012-10-15 14:55:27

标签: c# types uri

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

Type.GetType("System.Uri");

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

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

...

任何人都知道,为什么返回的Type为null?

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

5 个答案:

答案 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.GetType(String)

     

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

     

返回值

     

输入:System.Type

     

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

因此,如果您输入拼写错误,则无法找到您的类型,并且会返回null。这不是一个错误。

答案 4 :(得分:1)

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