我正在尝试输入未知界面。typeof(A.B.C.Foo)
给我它的类型但Type.GetType("A.B.C.Foo")
为空。如何获取未知接口的类型?
4 回答
您可以在程序集中找到一个类型,然后获取该类型实例的实例:
C#:使用Assembly.GetTypes列出程序集中的所有类
因此,如果您想使用依赖注入定义一些基于插件的架构,您必须在一些清单文件中定义您公开的类型,更好的是,将其组装在其中。
Type.GetType
仅当类在当前执行的程序集中或位于 mscorelib.dll 中时,才可以无条件工作。如果不是这种情况,请使用程序集的完全限定名称以及类型信息来获取类型。例如:
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
位于一个单独的类库中。
Type.GetType(string)
期望类型的程序集限定名称作为参数,而您只是传递类型的全名。唯一不需要传递程序集限定名称的情况是类型在当前执行的程序集中或 mscorlib.dll 中。
如果您不知道它位于哪个程序集中,您可以遍历所有加载的程序集AppDomain.CurrentDomain.GetAssemblies()
并Assembly.GetType()
用于每个程序集,直到找到请求的类型。
GetType(string)如果它来自引用的程序集,则需要您指定AssemblyQualifiedName(通常是顶级命名空间、任何子级命名空间和类名)。如果它在同一个程序集中,则只需要命名空间和类名。
AssemblyQualifiedName 的 MSDN 示例:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
LibraryTest
使用类引用项目的项目的简单示例Foo
:
var type = Type.GetType("LibraryTest.Foo, LibraryTest");