typeof(Foo)有效,但Type.GetType(" Foo")为空

时间:2013-11-06 14:30:34

标签: c# .net reflection types interface

我正在尝试键入未知界面。 typeof(A.B.C.Foo)为我提供了类型,但Type.GetType("A.B.C.Foo")为空。如何获得未知界面的类型?

4 个答案:

答案 0 :(得分:1)

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

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

因此,如果您想要使用依赖项注入定义一些基于插件的体系结构,则必须在某些清单文件中定义您公开的类型,更好的是它所在的程序集。

答案 1 :(得分:1)

如果类在当前正在执行的程序集中或位于mscorelib.dll中,则

Type.GetType仅在没有限定条件下工作。如果不是这种情况,请使用程序集的fully qualified name和类型信息来获取类型。 E.G:

    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位于单独的类库中。

答案 2 :(得分:1)

Type.GetType(string)期望该类型的程序集限定名称作为参数,并且您只是传递该类型的全名。只有在类型位于当前正在执行的程序集或mscorlib.dll中时,唯一不需要传递程序集限定名称的时间。

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

答案 3 :(得分:0)

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

AssemblyQualifiedName的MSDN示例:

TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly

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

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