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

How to add parameter that will never be used to expression tree in C#?

我的代码中有一个方法 MyMethodpublic void MyMethod(String input)。是MyNamespace.MyClass的方法,我用的MyClass的实例是MyObject。 我正在创建一个调用 MyObject.MyMethodinput 参数始终设置为 "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.Lambda 下定义最后两个 Expression.Parameter 时,出现 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")

之后