gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:03:39 26 4
gpt4 key购买 nike

如果我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com