一尘不染

如何将事件传递给方法?

c#

我想创建一个将事件作为参数并将其添加到事件处理程序以正确处理的方法。像这样:

我有两个事件:

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”只能出现在+ =或-=的左侧


阅读 317

收藏
2020-05-19

共1个答案

一尘不染

我的原始答案适合在定义事件的类中使用,但是您已经更新了问题,以反映您希望从定义类之外完成此操作,因此,我已将其删除。

只有定义事件的类才能引用该事件使用的隐式委托变量。在该类之外,您只能通过和来访问addremove方法。这意味着您不能直接执行您要问的事情。但是,您可以使用功能性方法。+=``-=

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<EventHandler> attach){
        attach(HandleEvent);
    }

    static void Main(){
        A a = new A();
        AttachToEvent(handler=>a.Event1 += handler);
        a.TriggerEvent1();
    }
}
2020-05-19