gpt4 book ai didi

C# 事件空检查(来自另一个类)

转载 作者:行者123 更新时间:2023-11-30 14:39:21 24 4
gpt4 key购买 nike

我将 lambda 表达式设置为事件的事件处理程序

proxy.SomeEvent += (sender, e) => { doSomething(); };

但是调试的时候发现doSomething()被执行了两次,因为不知为何上面的事件赋值语句被执行了两次。

所以我想在调用事件赋值语句之前检查 proxy.SomeEvent 是否为 null,例如:

if(proxy.SomeEvent == null)
{
proxy.SomeEvent += (sender, e)=> { doSomething(); };
}

但我收到编译器错误事件“Proxy.SomeEvent”只能出现在+= 或-= 的左侧

由于无法通过 -= 运算符删除 lambda 表达式事件处理程序,是否有其他方法可以让我检查事件是否已分配?

最佳答案

没有(标准的)方法来“检查”事件处理程序的内容。

唯一有效的形式(用于外部访问)是:

obj.Event += Handler;
obj.Event -= Handler;

当在类外部访问时,它不允许在事件上调用任何方法,也不支持任何其他运算符。

但是,如果您以保留原始 处理程序的方式编写它,那么您可以事先将其删除。

public Handler(object sender, EventArgs) {
...
}

// remove if already added (does nothing if it was not added)
// there is no (standard) way to check if it was added so this
// is just a pre-emptive remove
proxy.SomeEvent -= Handler;
// and add the handler
proxy.SomeEvent += Handler;

我并不是说这是最好/好的方法(例如,为什么处理程序允许被多次分配给“同一个”处理程序?),但这是我的一种方法偶尔用过。

快乐编码。

关于C# 事件空检查(来自另一个类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6529708/

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