C#中如何在运行时将类型参数作为泛型传递?
解决泛型方法动态传递运行时类型参数的问题
问题场景
需要实现一个接收字符串参数的函数,根据参数获取两个运行时类型,再将这两个类型传入泛型方法factory.Create<T1,T2>(),原代码如下:
public void Foo(string a) { var typeb = typebProvider.GetType(a); var typec = typecPrivoder.GetType(a); var d = factory.Create<typeb,typec>(); }
运行时报错:‘typeb 是变量,但被当作类型使用’
原因分析
泛型方法的类型参数<T1,T2>要求在编译阶段确定具体类型,但typeb和typec是运行时通过GetType()获取的Type对象,属于变量,无法直接作为泛型类型参数使用。
修改方案
通过反射调用泛型方法,步骤如下:
- 获取
Create方法的泛型定义 - 使用
MakeGenericMethod传入动态获取的Type对象,构造出具体的泛型方法 - 调用构造好的方法并处理返回值
修改后的代码示例:
public void Foo(string a) { Type typeb = typebProvider.GetType(a); Type typec = typecPrivoder.GetType(a); // 获取泛型方法的定义,替换FactoryType为factory的实际类型 MethodInfo createMethod = typeof(FactoryType) .GetMethod("Create") .MakeGenericMethod(typeb, typec); // 调用方法并转换返回类型,替换YourReturnType为Create方法的实际返回类型 var d = (YourReturnType)createMethod.Invoke(factory, null); }
注意事项
- 需将代码中的
FactoryType替换为factory实例的实际类型 - 将
YourReturnType替换为Create<T1,T2>方法的实际返回类型 - 如果
Create方法存在重载,需使用GetMethod的重载版本指定参数类型,以精准匹配目标方法
内容的提问来源于stack exchange,提问作者Huak
相关产品推荐
相关产品推荐

