C# 在运行时使用反射构造泛型的具体类型的实例
考虑以下类别:C# 在运行时使用反射构造泛型的具体类型的实例,c#,generics,reflection,C#,Generics,Reflection,考虑以下类别: public class GenericClass<T> { public T Argument; } 公共类GenericClass { 公开辩论; } 第二个类引用并使用GenericClass: public class ClientClass { GenericClass<T> genclass = new GenericClass<T>(); } public类ClientClass
public class GenericClass<T>
{
public T Argument;
}
公共类GenericClass
{
公开辩论;
}
第二个类引用并使用GenericClass:
public class ClientClass
{
GenericClass<T> genclass = new GenericClass<T>();
}
public类ClientClass
{
GenericClass genclass=新的GenericClass();
}
我的问题是在编译时我不知道t的类型。我在运行时使用反射来获取T的类型。在实例化
GenericClass
时是否可以使用参数化表达式?是的,但是您必须使用反射来构建您要查找的实际类型
您首先需要使用typeof
操作符获取open泛型:
var openType = typeof(GenericClass<>);
但是,正如xanatos在评论中所指出的,您应该知道这会导致类型为object
的成员。要在不反射的情况下操纵对象,您有两个选择
GenericClass
,从中派生GenericClass
,并在其上包含所有人都通用的方法。(即GenericClass
包含不需要使用t
的成员IInterface
,然后在T
,中添加一个限制,其中T:IInterface
。然后,您可以将实例
转换为泛型类
,并以这种方式操作它。显然,类型
必须实现IInterface在这种情况下,为面
当然,您也可以只保留
对象
引用,并仅使用反射操作它,或者使用动态
延迟绑定任何方法调用——不过,这会在引擎盖下使用反射。您是否考虑过在T上添加一个限制,其中T:IMyInterface。这样您就不需要依赖反射。@Ingenu但是他仍然需要一个具体的类型来实例化他的类,以包含正确的Tright@DavidPfeffer添加T:new()将允许您调用new T()
@ingeu您只能调用new T()
在泛型类的内部
。在外部,T
没有定义的含义。无论哪种方式,它都不会帮助他直接操作打开的泛型。+1,然后发现没有反射就无法使用它:-),甚至在没有反射或投射到对象的情况下也无法传递它。这是一个悲伤的世界。你应该写object closeType
,让它更明显。对于你的回复,我会调查一下,也许会再给你进一步解释:)@xanatos好主意。我已经更新了代码并添加了一些更有用的提示。@panipsilos如果我已经解决了您的问题,请单击答案旁边的复选标记,将答案标记为已接受。欢迎来到StackOverflow!
var closedType = openType.MakeGenericType(type);
object instance = Activator.CreateInstance(closedType);