【问题标题】:typeof(Foo) works but Type.GetType("Foo") is nulltypeof(Foo) 有效,但 Type.GetType("Foo") 为空
【发布时间】:2013-11-17 20:19:01
【问题描述】:

我正在尝试输入未知界面。 typeof(A.B.C.Foo) 给了我它的类型,但 Type.GetType("A.B.C.Foo") 为空。如何获取未知接口的类型?

【问题讨论】:

  • 检查typeof(A.B.C.Foo).AssemblyQualifiedName 的值。该值是您需要传递给Type.GetType 的字符串。

标签: c# .net reflection types interface


【解决方案1】:

您可以在程序集中找到一个类型,然后获取该类型实例的 instance

C#: List All Classes in Assembly 使用Assembly.GetTypes

因此,如果您想使用依赖注入定义一些基于插件的架构,您必须在一些清单文件中定义您公开的类型,更好的是,将其组装在其中。

【讨论】:

    【解决方案2】:

    Type.GetType(string) 期望类型的程序集限定名称 作为参数,而您只是传递类型的全名。唯一不需要传递程序集限定名称的情况是类型在当前执行的程序集中或 mscorlib.dll 中。

    如果您不知道它位于哪个程序集中,您可以使用 AppDomain.CurrentDomain.GetAssemblies() 遍历所有已加载的程序集,并为每个程序集使用 Assembly.GetType(),直到找到请求的类型。

    【讨论】:

      【解决方案3】:

      Type.GetType 仅在类位于当前执行的程序集中或位于 mscorelib.dll 中时才有效。如果不是这种情况,请使用程序集的fully qualified name 以及类型信息来获取类型。例如:

          static void Main(string[] args)
          {
              var result1 = typeof (ClassLibrary2.Class1);
              var result2 = Type.GetType("ClassLibrary2.Class1");//returns null because Class1 is not in the currently executing assembly or mscorlib
      
              var assembly = Assembly.GetAssembly(typeof(ClassLibrary2.Class1));
      
              var result3 = Type.GetType("ClassLibrary2.Class1, " + assembly.FullName);
      
              Console.WriteLine("{0}, {1}, {2}", result1, result2, result3);
          }
      

      这里的 Main 在控制台应用程序中。 ClassLibrary2.Class1 位于单独的类库中。

      【讨论】:

        【解决方案4】:

        GetType(string) 要求您指定 AssemblyQualifiedName(通常是顶级命名空间、任何子级命名空间和类名),如果它来自引用的程序集。如果它在同一个程序集中,则只需要命名空间和类名。

        AssemblyQualifiedName 的 MSDN 示例:

        TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
        

        使用类 Foo 引用项目 LibraryTest 的项目的简单示例:

        var type = Type.GetType("LibraryTest.Foo, LibraryTest");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-10
          • 2010-12-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多