[英]Check if a method is already registered to an event
我正在尝试正确检查对象的事件是否已设置为特定方法。
该stackoverflow问题提供了2个解决方案:
我有几个与第二种解决方案有关的问题。 让我们假设以下代码
public static class Util
{
public static bool IsRegistered<T>(this EventHandler<T> handler, Delegate prospectiveHandler)
=> handler != null
&& handler.GetInvocationList().Any(existingHandler => existingHandler == prospectiveHandler));
}
public class Object1
{
public event EventHandler<string> OnSomething;
public bool CheckOnSomething(Delegate handler) => this.OnSomething.IsRegistered(handler);
}
public class Object2
{
private Object1 o;
public Object2(Object1 o1)
{
this.o = o1;
}
public void CatchSomething(object sender, string something)
{
// ...
}
public void HookToSomething()
{
if (!o.CheckOnSomething( ??? ))
o.OnSomething += this.CatchSomething;
}
}
CheckOnSomething
,我需要将委托传递给CatchSomething
。 我必须为此定义一个新的委托,还是已经有我可以使用的东西?false
吗?为了调用
CheckOnSomething
,我需要将委托传递给CatchSomething
。 我必须为此定义一个新的委托,还是已经有我可以使用的东西?
你可以直接通过CatchSomething
:
if (!o.CheckOnSomething(CatchSomething))
o.OnSomething += CatchSomething;
但是您需要更新CheckOnSomething
以接受特定的委托类型,以便可以转换CatchSomething
:
public bool CheckOnSomething(Action<object, string> handler)
=> this.OnSomething.IsRegistered(handler);
这也提高了类型安全性,因为现在只能传递具有正确签名的委托。
如果我定义一个新的委托,委托平等会起作用吗? 文档说它检查委托类型,但是由于我直接传递该方法,所以不是动态创建的新委托类型,这会使相等性始终返回 false?
传递该方法会创建一个新的委托实例而不是新的委托类型; 委托类型将始终是Action<object, string>
。
但是, 委托相等性依赖于目标和类型,因此传递CatchSomething
仅当它来自同一个实例时才会被认为是相等的。
例如:
var obj1 = new Object1();
var instance1 = new Object2(obj1);
// Creates a delegate instance:
Action<object, string> catchSomething = instance1.CatchSomething;
catchSomething == instance1.CatchSomething; // true
var instance2 = new Object2(obj1);
catchSomething == instance2.CatchSomething; // false
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.