c# - 在 C# 中,为什么我不能传递另一个类的 EventHandler 引用,我该如何绕过它?

标签 c# events event-handling

如果我的 ClassA 有一个公共(public)事件 SomeEvent,而 ClassC 有方法 addListener,它接受 EventHandler 引用,为什么 ClassB 不能有一行 c.addListener(ref a.SomeEvent)?如果我尝试,我会得到一个编译器错误:“事件‘ClassA.SomeEvent’只能出现在 += 或 -= 的左侧(除非在类型‘ClassA’中使用)。

为什么存在这个限制?我怎样才能在合理靠近我的结构的同时绕过它?

我是 C# 新手;任何帮助,将不胜感激。谢谢!

class ClassA {
    public event EventHandler SomeEvent;
}

ClassB{
    public ClassB() {

        ClassA a = new ClassA();
        ClassC c = new ClassC();
        c.addListener(ref a.SomeEvent);  //Compile error
    }
}

class ClassC {
    public void addListener(ref EventHandler handler) {
        handler += onEvent;
    }

    private void onEvent(object sender, EventArgs e) {
        //do stuff
    }

}

最佳答案

在类之外,您可以访问addremove 访问器 - 这就是 您既不能看到其他订阅者,也不能更改他们(例如,将事件设置为 null)。不如正常处理,后果自负。

想象一下,您可以按照您的建议去做。例如,假设您订阅了一个按钮点击,而一些其他代码使用该信息将您连接到“滴答”事件 - 您的代码不会像预期的那样工作 =错误。

明确地说;一个事件不是一个EventHandler,就像一个属性不是一个int一样——事件/属性定义访问器方法

根据您的情况,将 OnEvent 公开并使用 a.SomeEvent += c.OnEvent;,或者使用一些类似的方法和使用匿名方法:

a.SomeEvent += delegate { c.DoSomethingCool(); };

关于c# - 在 C# 中,为什么我不能传递另一个类的 EventHandler 引用,我该如何绕过它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1994378/

相关文章:

events - 通用分析无法正常工作

Javafx Treeview 项目操作事件

c# - 将所有标准事件处理程序替换为 WeakEventManager 或其变体是否安全?

javascript - Event.observe 函数 - 按类而不是 id 观察元素

c# - 尝试从包含 UNION 的 View 中进行 SELECT 时出现 DB2 'SQL0901 SQL System Error.'

C# Clean Architecture - 创建抽象的最佳方法

c# - Linq 查询中的意外结果

jquery - Kendo UI窗口关闭事件: prevent window close

c# - 使用 Linq 关联防止空异常

javascript - 仅 <a> 标签上的 DOMSubtreeModified 事件(和/或替换)?