如何在C#中添加永远不会用于表达式树的参数?

问题描述

我的代码MyMethod中有一个方法:public void MyMethod(String input)。这是MyNamespace.MyClass的一种方法,我正在使用的MyClass的实例是MyObject。 我正在创建一个事件处理程序,该事件处理程序始终将MyObject.MyMethod参数设置为input来调用"test"。但是,我正在使用表达式树创建它。这是我当前的代码,该代码可以设置input,但不能设置事件处理程序的必需ObjectEventArgs参数:

Expression.Lambda(Expression.Call(Expression.Constant(MyObject),typeof(MyNamespace.MyClass).GetMethod("MyMethod"),Expression.Constant("test"),Expression.Parameter(typeof(Object),"sender"),Expression.Parameter(typeof(EventArgs),"e"))).Compile();

我收到错误消息:Incorrect number of arguments supplied for call to method 'Void MyMethod(System.String)'

当我尝试直接在Expression.Parameter下定义最后两个Expression.Lambda时,出现了Parameter count mismatch错误。

我拥有的最后一个工作代码只是完全取出了最后两个Expression.Parameter

即使不使用它们也如何定义这些参数,以使该方法成为事件处理程序?

解决方法

您的右括号位置错误。 sendere是Lambda的参数,而不是MyMethod的参数,应将它们添加为Expression.Lambda中的参数:

Expression.Lambda(
    Expression.Call(Expression.Constant(MyObject),typeof(MyClass).GetMethod("MyMethod"),Expression.Constant("test")),Expression.Parameter(typeof(Object),"sender"),Expression.Parameter(typeof(EventArgs),"e")
).Compile();

请注意,Expression.Call右括号在Expression.Constant("test")之后

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...