C# 检查事件是否有侦听器?
是否可以检测事件是否有侦听器?(如果没有人需要,我需要处理我的事件提供程序对象)您可以检查事件是否为!=空 顺便说一下,在C#中,每次引发事件时都需要此检查:C# 检查事件是否有侦听器?,c#,.net,clr,C#,.net,Clr,是否可以检测事件是否有侦听器?(如果没有人需要,我需要处理我的事件提供程序对象)您可以检查事件是否为!=空 顺便说一下,在C#中,每次引发事件时都需要此检查: if (TheEvent != null) { TheEvent(this, e); } 原因就是要检查事件是否有侦听器 编辑 由于无法从类外部访问事件,因此可以实现一个执行检查的方法: public class TheClass { public bool HasEventListeners() { r
if (TheEvent != null) {
TheEvent(this, e);
}
原因就是要检查事件是否有侦听器
编辑由于无法从类外部访问事件,因此可以实现一个执行检查的方法:
public class TheClass {
public bool HasEventListeners() {
return TheEvent != null;
}
}
假设该类位于第三方库中且无法修改:
public class Data
{
public event EventHandler OnSave;
//other members
}
在您的程序中:
Data d = new Data();
d.OnSave += delegate { Console.WriteLine("event"); };
var handler = typeof(Data).GetField("OnSave", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(d) as Delegate;
if (handler == null)
{
//no subscribers
}
else
{
var subscribers = handler.GetInvocationList();
//now you have the subscribers
}
我需要在对象外部检查它,因为它是由第三方制造的。我需要检查是否有人订阅了对象的事件,并在没有订阅的情况下处理它。我不认为你可以,你需要一个方法包装器。你的意思是“既然你不能访问…”在最后一句话中?似乎调用GetInvocationList并不是真的必要,检查处理程序是否为null就足够了。我说得对吗?@user626528:是的,你说得对。在这个例子中,我展示了一些在某些情况下可能有用的东西。如果没有添加OnSave事件时处理程序将为null,那么上面的代码应该有null检查,否则会出错。如果您确实可以访问库源代码,这甚至很方便,但是您的代码在不同程序集中的解决方案之间是分开的。无论如何,我还有一个好答案。
void Main()
{
Console.WriteLine(ContainsOnSomethingEvent()); // false
OnSomething += (o,e) => {};
Console.WriteLine(ContainsOnSomethingEvent()); // true
}
EventHandler mOnSomething;
event EventHandler OnSomething {
add { mOnSomething = (EventHandler)EventHandler.Combine(mOnSomething, value); }
remove { mOnSomething = (EventHandler)EventHandler.Remove(mOnSomething, value); }
}
public bool ContainsOnSomethingEvent() {
return mOnSomething != null && mOnSomething.GetInvocationList().Length > 0;
}