C#-如何获取';具有泛型参数的类';在运行时
本文关键字:参数 泛型 运行时 获取 何获取 C#- | 更新日期: 2023-09-27 18:22:00
我有一个通用类,如下所示:
using System.Collections.Generic;
namespace MyNameSpace
{
public class MyClass<T> : MyAnotherClass
{
public MyClass();
public MyClass(T obj);
public T Object { get; set; }
}
}
我不明白为什么下面的代码行返回空(throwing exception with message : "Could not load type 'MyClass' from assembly '//assembly details//' "
)
Type MyClassType = AssemblyContaingMyClass.GetType("MyNameSpace.MyClass");
将Assembly.GetType(className)与泛型类一起使用是否违法?
您能建议其他方法在运行时获取泛型类的类型吗?
如果这个问题太基本,请提前感谢并道歉。我是c#的新手。
编辑:
忘了提。将在运行时加载包含MyClass的程序集。
我认为您必须在运行时使用CLR命名来访问泛型类型:
AssemblyContaingMyClass.GetType("MyNameSpace.MyClass`1");
在CLR中,泛型的命名没有提及类型参数,但后面有一个反勾号(`
),后面跟着泛型类型参数的数量。
不能这样做的原因是,简单地说,没有名为MyClass
的类。有一个通用类定义,它的名称有点像MyClass`1
,还有类型的每一个变体,它的名字看起来像MyClass`1[System.String]
等等。
获取类型的最简单方法是使用typeof
关键字,如:
var genericType = typeof(MyClass<>);
var specificType = typeof(MyClass<string>);
但是,如果您必须按其名称从程序集中加载它,则需要提供全名,如下所示:
var genericType = assembly.GetType("MyClass`1");
var specificType = assembly.GetType("MyClass`1[System.String]");
当涉及到泛型类型的命名时,它是ClassName`<number of generic arguments>
这就是你想要的吗?
public class MyClass<T>
{
public T TheGeneric { get; set; }
}
Type theType = typeof(MyClass<>);
try(无T):
Type template = typeof(MyNameSpace.MyClass<>);