我可以将typeof(string)的结果传递给泛型?

时间:2011-10-25 16:39:23

标签: c#

这有什么问题,我应该做什么来将类型传递给泛型?

Type t = typeof(string);

var someThing = new SomeThing<t>(100);

4 个答案:

答案 0 :(得分:4)

通用参数必须在编译时知道。这就是他们如何确保编译时的安全性。在您的情况下,您有一个动态类型,在编译时不知道。 t变量的值仅在运行时已知。所以在这种情况下你不能使用泛型。

如果必须使用运行时类型,则必须使用反射。

答案 1 :(得分:4)

你必须使用反射来做到这一点:

var openType = typeof(SomeThing<>);
var constructedType = openType.MakeGenericType(new[] { typeof(string) });
var instance = Activator.CreateInstance(constructedType);

这不会那么有用,因为您无法以通用方式使用该类型,但如果您需要为API调用动态构造泛型类型,则此方法会很有用。

答案 2 :(得分:1)

您应该使用以下代码动态构建通用:

 Type generic = typeof(SomeThing<>); 
 Type[] typeArgs = { typeof(string) };

 Type constructed = generic.MakeGenericType(typeArgs);

 dynamic someThing = Activator.CreateInstance(constructed);

答案 3 :(得分:0)

通用参数需要是语言类型,而不是类类型的实例。

GetType()是一个虚函数,它返回一个System.Type类的实例,可以在运行时使用它来获取有关给定类型的信息,但当然,我们不能将它用作通用参数类型。 泛型部分在编译时处理,部分在运行时处理,但它们需要与语言类型一起使用。

现在,要解决您的问题,您必须改变策略。 根据我的经验,通常你不需要使用泛型和反射太多,如果你以不同的方式表达你的问题,你可以找到一个只使用反射,只有继承,只有泛型或至少只有泛型和继承的解决方案。

例如:

MyReturnType MyBestFunction<T>(.....)
{
    var someThing = new SomeThing<T>(100);
    ...
    ...
}

Then you can use your function passing the generic parameter.

var x = MyBestFunction<string>(....);