我正在尝试键入未知界面。 typeof(A.B.C.Foo)
为我提供了类型,但Type.GetType("A.B.C.Foo")
为空。如何获得未知界面的类型?
答案 0 :(得分:1)
您可以在程序集中找到类型,然后获取该Type实例的实例:
C#: List All Classes in Assembly使用Assembly.GetTypes
因此,如果您想要使用依赖项注入定义一些基于插件的体系结构,则必须在某些清单文件中定义您公开的类型,更好的是它所在的程序集。
答案 1 :(得分:1)
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");