如何从getType对象使用泛型Type

时间:2013-12-04 11:06:45

标签: c# reflection types

我有MyClass<T>

var Myobj = authorObject.getType();

如何从MyClass var

实例化Myobj对象

我测试了这段代码并且无效

var x = new MyClass<Myobj>();

2 个答案:

答案 0 :(得分:4)

我假设您之前不知道要作为MyClass的类型参数提供的类型。您可以通过反射动态创建类型,例如:

var testVar = 123;
var genType = typeof(MyClass<>).MakeGenericType(testVar.GetType());
var genInstance = Activator.CreateInstance(genType);
Console.WriteLine(genInstance.GetType().FullName);
  • MakeGenericType使用提供的类型参数创建泛型类型的类型。
  • Activator.CreateInstance为给定类型和构造函数参数创建一个新实例(为简单起见,我省略了该实例)。如果MyClass需要构造函数参数,则必须在此处提供它们。

如果您需要访问MyClass<T>的特定成员,我建议创建一个非泛型接口(或基类),其中包含MyClass实现的所需成员(分别派生自)。然后,您可以将Activator.CreateInstance的返回值转换为该接口,并使用接口定义的成员。
如果要访问依赖泛型类型参数的MyClass<T>成员,则必须通过反射动态访问它们,因为通用类型定义是动态创建的。您可以使用InvokeMember方法。在下面的示例中,我假设MyClass<T>包含属性值为T的值,我得到以下值:

object value = genType.InvokeMember("Value", BindingFlags.Public | 
                                                 BindingFlags.Instance | 
                                                 BindingFlags.GetProperty, 
                                             null, genInstance, null);
Console.WriteLine(value);

如果您在设计时知道值的类型,您还可以转换InvokeMember的返回值。

如需完整样本,请参阅此link

答案 1 :(得分:0)

您可以使用Type.MakeGenericType和Activator:

Type genType = typeof(MyClass<>);
Type type = genType.MakeGenericType(typeof(MyObj);

var x = Activator.CreateInstance(type);