通过反射创建Func委托报错:lambda声明参数数量不正确(.NET 4.6.1)
问题解决:运行时编译代码创建委托时参数数量错误
错误原因分析
你的代码出现Incorrect number of parameters supplied for lambda declaration错误,核心问题有三个:
- 参数类型错误:
Param = Expressions.Expression.Parameter(Method.GetParameters.First.GetType)获取的是ParameterInfo的类型,而非方法实际参数的类型(MyItemClass),导致参数类型不匹配。 - Lambda参数未绑定:创建
Expression.Lambda时,没有将定义的参数Param传入Lambda的参数列表,导致Lambda无法识别需要接收的输入参数,参数数量不匹配。 - 静态方法误用实例获取:
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
相关产品推荐
相关产品推荐

