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
    的成员
  • 正如Ingenu在对该问题的评论中所提到的,您可以创建一个接口
    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);