繁体   English   中英

检查方法是否已注册到事件

[英]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;
    }
}
  1. 为了调用CheckOnSomething ,我需要将委托传递给CatchSomething 我必须为此定义一个新的委托,还是已经有我可以使用的东西?
  2. 如果我定义一个新的代表,代表平等会起作用吗? 文档说它检查委托类型,但由于我直接传递方法,不是动态创建的新委托类型,这会使相等性总是返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM