这有什么问题,我应该做什么来将类型传递给泛型?
Type t = typeof(string);
var someThing = new SomeThing<t>(100);
答案 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>(....);