如何将事件传递给方法?

我想创建一个方法,将事件作为参数,并向其添加eventHandler以正确处理它。 像这样:

我有两个事件:

public event EventHandler Click; public event EventHandler Click2; 

现在我想将一个特定事件传递给我的方法(伪代码):

 public AttachToHandleEvent(EventHandler MyEvent) { MyEvent += Item_Click; } private void Item_Click(object sender, EventArgs e) { MessageBox.Show("lalala"); } ToolStripMenuItem tool = new ToolStripMenuItem(); AttachToHandleEvent(tool.Click); 

可能吗?

我注意到这段代码工作正常,并返回到我的项目,并注意到当我传递在我的类中声明的事件时,它可以工作,但是当我从其他类传递事件时,它仍然无效。

我得到的是这个错误:

事件’System.Windows.Forms.ToolStripItem.Click’只能出现在+ =或 – =的左侧

我的原始答案适合于定义该事件的类中,但您已经更新了您的问题,以反映您希望从定义类之外完成此操作,所以我已经打败了它。

只有定义事件的类才能引用事件使用的隐式委托变量。 从该类外部,您只能通过+=-=访问addremove方法。 这意味着你不能直接做你所要求的。 但是,您可以使用function方法。

 class A{ public event EventHandler Event1; public void TriggerEvent1(){ if(Event1 != null) Event1(this, EventArgs.Empty); } } class B{ static void HandleEvent(object o, EventArgs e){ Console.WriteLine("Woo-hoo!"); } static void AttachToEvent(Action attach){ attach(HandleEvent); } static void Main(){ A a = new A(); AttachToEvent(handler=>a.Event1 += handler); a.TriggerEvent1(); } } 

我是这样做的:

 public AttachToHandleEvent(Object obj, string EventName) { EventInfo mfi = obj.GetType().GetEvent(EventName); MethodInfo mobj = mfi.GetAddMethod(); mobj.Invoke(obj, new object[] { Item_Click}); } private void Item_Click(object sender, EventArgs e) { MessageBox.Show("lalala"); } ToolStripMenuItem tool = new ToolStripMenuItem(); AttachToHandleEvent(tool "Click"); 

谢谢大家的建议。 没有你的帮助,这个解决方案是无法完成的。

这是不可能的。 如果满足您的需求,您可以使用代理而不是事件。

只需编写工具。 tool.Click += Item_Click;

编辑:从MSDN“事件只能从声明它们(它)的类或结构中调用”。 所以你要做的就是不可能。 你能详细说明你的需求吗? 为什么要将事件作为参数传递?

  delegate void doIt(object sender, object data); event doIt OnDoIt; void add(doIt theDel) { OnDoIt += theDel; } void doIt1(object a, object b) { } void doIt2(object a, object b) { } void add() { add(doIt1); add(doIt2); } 

你的问题表明你有一些错误的机制:你无法传递事件!

您最有可能希望将函数作为参数传递,因此调用方法将在某个时刻调用该其他方法。 在技​​术方面,这是一个代表。 我建议使用已定义的Action类。 这是一个示例代码段:

 void MyFunction (string otherArguments, Action onFinished){ ... if (onFinished != null) onFinished.Invoke(); } 

关于这一点的好处是,当调用MyFunction时,您可以使用内联语法声明Action:

 MyFunction("my other argument", ()=>{ ///do stuff here, which will be execuded when the action is invoked });