使用运行时的反射构造泛型的具体类型的实例

时间:2011-10-18 11:55:17

标签: c# generics reflection

考虑以下课程:

public class GenericClass<T>
{
   public T Argument;                
}

第二个引用和使用GenericClass的类:

public class ClientClass
{
    GenericClass<T> genclass = new GenericClass<T>();
}

我的问题是我在编译时不知道T的类型。我在运行时使用反射来获取T的类型。在实例化GenericClass时,是否有可能以某种方式使用参数化表达式?

1 个答案:

答案 0 :(得分:5)

是的,但你必须使用反射来构建你正在寻找的实际类型。

首先,您需要使用typeof运算符

来获取开放式泛型
var openType = typeof(GenericClass<>);

Next, you need to build the specific generic you want.说出您想要的类型T存储在变量type

var closedType = openType.MakeGenericType(type);

Finally, use reflection to create an instance of that type.

object instance = Activator.CreateInstance(closedType);

正如xanatos在评论中所指出的,您应该知道这会导致object类型的成员。为了能够在没有反射的情况下操纵对象,您有两种选择。

  1. 您可以创建GenericClass从中派生的父类GenericClass<T>,并在其上包含所有共有的方法。 (即GenericClass包含不需要使用T的成员。
  2. 正如Ingenu在问题评论中提到的那样,您可以创建一个界面IInterface,然后在Twhere T : IInterface上添加限制。然后,您可以将instance转换为GenericClass<IInterface>并以此方式操纵它。显然,在这种情况下,type必须实施IInterface
  3. 您当然也可以保留object引用并仅使用反射来操作它,或者使用dynamic来对任何方法调用进行后期绑定 - 但是,这会使用反射。 / p>