如何将事件传递给方法?

Tom*_*ski 24 c# events delegates event-handling

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

我有两个事件:

public event EventHandler Click;
public event EventHandler Click2;
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

可能吗?

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

我得到的是这个错误:

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

P D*_*ddy 25

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

只有定义事件的类才能引用事件使用的隐式委托变量.从该类外部,您只能访问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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*ski 6

我是这样做的:

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");
Run Code Online (Sandbox Code Playgroud)

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