C# – 如何在运行时获取’class with generic parameter’?
我有一个generics类,如下所示:
using System.Collections.Generic; namespace MyNameSpace { public class MyClass : MyAnotherClass { public MyClass(); public MyClass(T obj); public T Object { get; set; } } }
我不明白为什么下面的代码行返回null( throwing exception with message : "Could not load type 'MyClass' from assembly '//assembly details//' "
)”
Type MyClassType = AssemblyContaingMyClass.GetType("MyNameSpace.MyClass");
将Assembly.GetType(className)与generics类一起使用是违法的吗?
您能否建议在运行时获取generics类的替代方法?
如果这个问题太基础,请提前致谢并道歉。 我是c#的新手。
编辑:
忘了提。 包含MyClass的程序集将在运行时加载。
我认为你必须使用CLR命名来在运行时访问generics类型:
AssemblyContaingMyClass.GetType("MyNameSpace.MyClass`1");
在CLR中,generics的命名没有提到类型参数,但是后缀( `
)后跟generics类型参数的数量。
这就是你追求的吗?
public class MyClass { public T TheGeneric { get; set; } } Type theType = typeof(MyClass<>);
你不能这样做的原因是,简单地说,没有名为MyClass
类。 有通用类定义,其名称类似于MyClass`1
,然后有类型的每个变体,其名称看起来像MyClass`1[System.String]
等。
获取类型的最简单方法是使用typeof
关键字,如下所示:
var genericType = typeof(MyClass<>); var specificType = typeof(MyClass);
但是,如果必须通过名称从程序集加载它,则需要提供如下所示的全名:
var genericType = assembly.GetType("MyClass`1"); var specificType = assembly.GetType("MyClass`1[System.String]");
当涉及到generics类型的命名时,它的ClassName`
尝试(没有T):
Type template = typeof(MyNameSpace.MyClass<>);