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

通过反射创建Func委托报错:lambda声明参数数量不正确(.NET 4.6.1)

问题解决:运行时编译代码创建委托时参数数量错误

错误原因分析

你的代码出现Incorrect number of parameters supplied for lambda declaration错误,核心问题有三个:

  1. 参数类型错误:Param = Expressions.Expression.Parameter(Method.GetParameters.First.GetType)获取的是ParameterInfo的类型,而非方法实际参数的类型(MyItemClass),导致参数类型不匹配。
  2. Lambda参数未绑定:创建Expression.Lambda时,没有将定义的参数Param传入Lambda的参数列表,导致Lambda无法识别需要接收的输入参数,参数数量不匹配。
  3. 静态方法误用实例获取:FindRule是静态方法,无需创建RuleTest实例,直接通过类型获取方法即可。

修正后的代码

public static void TestMe()
{
    // 生成测试数据
    var Items = new List<MyItemClass>();
    for (var i = 1; i <= 10; i++)
        Items.Add(new MyItemClass(i));

    // 编译VB代码
    var CompilerResult = Compile(VbCode);
    var AssType = CompilerResult.CompiledAssembly.GetType("RuleTest");
    // 直接通过类型获取静态方法,无需创建实例
    var Method = AssType.GetMethod("FindRule");
    
    // 正确获取方法参数的实际类型(MyItemClass)
    var paramType = Method.GetParameters()[0].ParameterType;
    var Param = Expressions.Expression.Parameter(paramType, "item");

    // 创建静态方法调用表达式,无需传入实例参数
    Expressions.Expression CallExpression = Expressions.Expression.Call(Method, Param);
    // 将定义的参数传入Lambda的参数列表,匹配Func的泛型参数结构
    var MyFunc = Expressions.Expression.Lambda<Func<MyItemClass, RuleTestResult>>(CallExpression, Param).Compile();

    var Results = new List<RuleTestResult>();
    foreach (var item in Items)
    {
        Results.Add(MyFunc(item));
    }
}

关键修正点说明

  • 静态方法处理:RuleTest是不可继承的静态类,FindRule是静态方法,直接通过AssType.GetMethod("FindRule")获取方法,避免创建不必要的实例。
  • 参数类型修正:使用Method.GetParameters()[0].ParameterType获取方法参数的实际类型,确保参数表达式的类型与方法要求一致。
  • Lambda参数绑定:在Expression.Lambda的第二个参数传入Param,明确告知Lambda表达式要使用该参数作为输入,解决参数数量不匹配的核心问题。

内容的提问来源于stack exchange,提问作者Gary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:10:16