在C#中使用Type对象作为泛型的类型参数

sgi*_*ons 5 c# generics types

我找不到在C#3.0/.NET 3.5的通用构造中使用第一类Type对象(System.Type实例)作为类型参数的方法.以下是我想要做的简化示例:

public void test()
{
    Type someType = getSomeType(); // get some System.Type object

    MyGeneric<someType> obj = new MyGeneric<someType>();  // won't compile
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用someType对象作为泛型的类型参数?

Tho*_*que 17

您可以动态创建该类型的实例:

public void test()
{
    Type someType = getSomeType(); // get some System.Type object
    Type openType = typeof(MyGeneric<>);
    Type actualType = openType.MakeGenericType(new Type[] { someType });
    object obj = Activator.CreateInstance(actualType);
}
Run Code Online (Sandbox Code Playgroud)

但是,您无法声明此类型的变量,因为您不能静态地知道实际类型.


Joe*_*orn 9

您正试图在运行时确定您的类型参数..Net泛型要求在编译时知道类型参数.在切换类型之外,实际上没有办法做到这一点.您可以通过反射获取方法的句柄并调用它,但这很难看.

  • +1托马斯展示了如何做到但你解释得更好_Why_反射是必需的. (3认同)