如何在C#2中创建一个包含3个参数的方法?

时间:2010-12-09 16:14:31

标签: delegates c#-2.0

我有以下方法:

    private void WriteTrace(object sender, EventArgs e, EventElement eventElement)
    {
    /* ... */
    }

当我想创建这样的委托:

Type controlType = control.GetType();
MethodInfo method = typeof(Trace).GetMethod("WriteTrace", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
EventInfo eventInfo = type.Value.GetType().GetEvent("Load");  // for the sample, we suppose the control is a form.
Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, method);
eventInfo.AddEventHandler(control, handler);

该行

Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, method);

生成错误:

  

绑定到目标方法的错误

但我不知道为什么?

此致

弗洛里安

2 个答案:

答案 0 :(得分:2)

Form.Load的类型为EventHandler,其中只有两个参数,而不是三个。换句话说,这也会失败:

EventHandler x = new EventHandler(WriteTrace);

您无法使用错误数量的参数从方法创建事件处理程序。 (实际上有一些技巧可以创建像这样的开放代表,但它们在这里并不相关,IMO。)

你真正想要实现的目标是什么?在这种情况下你会期望eventElement是什么?

请注意,您可以使用lambda表达式来捕获变量,例如

EventElement element = ...;
form.Load += (sender, args) => WriteTrace(sender, args, element);

这对你有帮助吗?或者你真的需要用反射来做这件事吗?

答案 1 :(得分:0)

简短的回答是你不能直接将事件处理程序绑定到具有三个参数的方法;传入的方法必须与签名完全匹配。

问题是,这个" EventElement"参数来自哪里?一旦你知道了,你可以把它放在另一个物体中,ala:

class HandlerThunk {
  EventElement eventElement;
  Trace receiver;

  // ...

  public void Handler(object sender, EventArgs e) {
    this.receiver.WriteTrace(sender, e, this.eventElement);  
  }
}

...然后绑定它......

HandlerThunk thunk = ...;

Type controlType = control.GetType();
MethodInfo method = typeof(HandlerThunk).GetMethod("WriteTrace", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
EventInfo eventInfo = type.Value.GetType().GetEvent("Load");  
Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, thunk, method);
eventInfo.AddEventHandler(control, handler);

然后thunk会将事件转发给你。