You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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对象,属于变量,无法直接作为泛型类型参数使用。

修改方案

通过反射调用泛型方法,步骤如下:

  1. 获取Create方法的泛型定义
  2. 使用MakeGenericMethod传入动态获取的Type对象,构造出具体的泛型方法
  3. 调用构造好的方法并处理返回值

修改后的代码示例:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:50:43