问题描述
我的代码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.Parameter
下定义最后两个Expression.Lambda
时,出现了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")
之后