如何在 C# 中向表达式树添加永远不会使用的参数?
How to add parameter that will never be used to expression tree in C#?
我的代码中有一个方法 MyMethod
:public void MyMethod(String input)
。是MyNamespace.MyClass
的方法,我用的MyClass
的实例是MyObject
。
我正在创建一个调用 MyObject.MyMethod
且 input
参数始终设置为 "test"
的事件处理程序。但是,我正在使用表达式树创建它。这是我当前的代码,它设法设置了 input
,但没有设置事件处理程序所需的 Object
和 EventArgs
参数:
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
。
如何定义这些参数(即使我不会使用它们)以使该方法成为事件处理程序?
您的右括号放错了位置。 sender
和 e
是 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")
之后
我的代码中有一个方法 MyMethod
:public void MyMethod(String input)
。是MyNamespace.MyClass
的方法,我用的MyClass
的实例是MyObject
。
我正在创建一个调用 MyObject.MyMethod
且 input
参数始终设置为 "test"
的事件处理程序。但是,我正在使用表达式树创建它。这是我当前的代码,它设法设置了 input
,但没有设置事件处理程序所需的 Object
和 EventArgs
参数:
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
。
如何定义这些参数(即使我不会使用它们)以使该方法成为事件处理程序?
您的右括号放错了位置。 sender
和 e
是 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")