c# - 如何将事件传递给方法?

标签 c# events event-handling delegates

我想创建一个方法,将事件作为参数并向其添加 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);

这可能吗?

我注意到这段代码运行良好,并返回到我的项目并注意到当我传递一个在我的类中声明的事件时,它起作用了,但是当我传递来自其他类的事件时它仍然不起作用。

我得到的是这个错误:

The event 'System.Windows.Forms.ToolStripItem.Click' can only appear on the left hand side of += or -=

最佳答案

我的原始答案适用于定义事件的类中,但你已经更新了你的问题以反射(reflect)你希望从定义类之外完成这个,所以我已经解决了。

只有定义事件的类才能引用事件使用的隐式委托(delegate)变量。在该类之外,您只能通过 +=-= 访问 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();
    }
}

关于c# - 如何将事件传递给方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2560258/

相关文章:

javascript - 在 jQuery 文档准备好之前在窗口上强制执行 DOMContentLoaded 事件

c# - 区分大型数据列表的最佳方式、算法和方法是什么?

javascript - 使弹出导航模式靠近区域外的触摸事件

c# - 如何访问继承表单上的控件?

php - Zendframework 2 使用静态方法调用服务

javascript - 在内联 onclick 处理程序中可以做什么有任何限制吗?

php - 如何在 ajax 提交后更新表单字段的默认值(不是表单重置)

perl - 为什么inotify会丢失事件?

c# - 命名空间自定义约定 - View 和 View 模型位于单独的程序集中

c# - 从完整的日期时间模式中仅提取日期模式