考虑以下课程:
public class GenericClass<T>
{
public T Argument;
}
第二个引用和使用GenericClass的类:
public class ClientClass
{
GenericClass<T> genclass = new GenericClass<T>();
}
我的问题是我在编译时不知道T的类型。我在运行时使用反射来获取T的类型。在实例化GenericClass
时,是否有可能以某种方式使用参数化表达式?
答案 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
类型的成员。为了能够在没有反射的情况下操纵对象,您有两种选择。
GenericClass
从中派生的父类GenericClass<T>
,并在其上包含所有共有的方法。 (即GenericClass
包含不需要使用T
的成员。IInterface
,然后在T
,where T : IInterface
上添加限制。然后,您可以将instance
转换为GenericClass<IInterface>
并以此方式操纵它。显然,在这种情况下,type
必须实施IInterface
。您当然也可以保留object
引用并仅使用反射来操作它,或者使用dynamic
来对任何方法调用进行后期绑定 - 但是,这会使用反射。 / p>