【问题标题】:Type.GetType not working [duplicate]Type.GetType 不起作用[重复]
【发布时间】:2012-10-15 14:55:27
【问题描述】:

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

Type.GetType("System.Uri");

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

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

...

谁知道,为什么返回的Type是null?

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

【问题讨论】:

  • 困惑:您在工作和不工作时都显示 System.URi
  • 我很惊讶 Type.GetType("System.string");Type.GetType("System.bool"); 正在工作,因为我不知道这些类型的存在。
  • Darin、string 和 bool 是 System 命名空间中类型的快捷方式。 msdn.microsoft.com/es-es/library/system.string(v=vs.80).aspx
  • @Oscar,我知道。但这些是 C# 特定的快捷方式。它们只是编译时别名。当您使用Type.GetType 方法时,您应该提供类型的完全限定名称。 Type.GetType("System.bool") 永远不会起作用,因为 BCL 中不存在这种类型。正确的类型名称是System.Boolean。和System.String。所以这里的这个问题没有任何意义。 @OP,请澄清你的问题。
  • @Oscar 我以为那些是编译时别名。 actual 类型是System.Boolean,实际上不存在System.bool。与System.string 相同。

标签: c# types uri


【解决方案1】:

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

来自 MSDN:

类型名称 类型:System.String

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

【讨论】:

    【解决方案2】:

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

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

    阿利斯泰尔

    【讨论】:

    • 哇,这是一个非常有用的功能,是藏起来的黄金宝石之一!
    • 这帮了我很多忙。
    • 谢谢它对我有用。
    【解决方案3】:

    试试这个代码:

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

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

    另一种方法是:

    Type t = typeof(Uri);
    

    【讨论】:

      【解决方案4】:

      Type.GetType(String):

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

      返回值

      类型:System.Type

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

      因此,如果您打错字,将找不到您的类型并返回null。这不是错误。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 我怀疑就是这样。如果你点击Type.GetType("System.Uri"),它会返回 null。但如果你使用Type.GetType("System.Uri, System"),它就可以正常工作。 (至少在 LinqPad 中)
        猜你喜欢
        • 2021-04-30
        • 1970-01-01
        • 2012-02-01
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 2013-08-11
        相关资源
        最近更新 更多