2009-09-23 101 views
4

我找不到在C#3.0/.NET 3.5的泛型构造中使用第一类Type对象(System.Type实例)作为类型参数的方法。下面是我想做一个简单的例子:使用Type对象作为C#中泛型的类型参数

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

    MyGeneric<someType> obj = new MyGeneric<someType>(); // won't compile 
} 

有没有办法使用SOMETYPE对象作为一个通用的类型参数?

+0

我个人使用了一个Switch。这可能并不适用于任何地方......我希望它可以像你的例子那样。 – 2011-12-13 21:14:31

回答

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); 
} 

但是你不能声明这种类型的变量,因为你不知道实际的类型静态。

+0

如果任何人通过这篇文章,在C#4.0 [动态关键字](http://msdn.microsoft.com/en-us/library/dd264741.aspx)允许您声明变量的编译时类型检查被禁用。 – 2014-01-09 09:49:00

+0

@JacobBundgaard,是的,但它与OP的问题无关。它不允许您在编译时不知道类型参数的情况下创建泛型类型的实例。 – 2014-01-09 10:16:53

+0

我不这么认为。动态声明将允许您调用通过反射创建的MyGeneric对象的方法,而对象声明不会。考虑MyGeneric有一个方法MyMethod。然后这段代码将不起作用:'object obj = Activator.CreateInstance(actualType); obj.MyMethod();',而这会:'dynamic obj = Activator.CreateInstance(actualType); obj.MyMethod();' – 2014-01-09 10:27:38

9

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

+3

+1托马斯显示如何做,但你更好地解释_why_反射是必需的。 – 2009-09-23 16:27:35

相关问题