2010-12-09 60 views
0

我有以下方法:如何在C#2中使用3个参数创建委托方法?

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); 

生成错误:

绑定到目标方法的错误od

但我不知道为什么?

问候,

弗洛里安

回答

2

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

EventHandler x = new EventHandler(WriteTrace); 

您无法从参数数量错误的方法创建事件处理程序。 (其实这里有一些关于创建公开委托的技巧,但在这里它们与IMO无关。)

你真的想达到什么目的?在这种情况下,你期望eventElement是什么?

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

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

这对你有帮助吗?或者你真的需要用反射做到这一点?

+0

好吧,我明白我的错误...谢谢 – Florian 2010-12-09 16:20:53

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将事件转发到你。

相关问题