首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查方法是否已注册到事件

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

Stack Overflow用户
提问于 2021-02-26 09:11:08
回答 1查看 613关注 0票数 3

我试图正确地检查对象的事件是否已经设置为特定的方法。

堆叠溢出问题提供了2种解决方案:

  • 一个快速而又脏的方法,它简单地注销该方法并再次注册它。
  • 一个更合适的方法,它检查是否已添加到方法的委托。

我有几个与第二个解决方案有关的问题。让我们假设下面的代码

代码语言:javascript
运行
复制
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吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-26 09:43:14

为了调用CheckOnSomething,我需要向CatchSomething传递一个委托。我是否必须为此定义一个新的委托,或者我已经可以使用什么了?

您可以直接传递CatchSomething

代码语言:javascript
运行
复制
if (!o.CheckOnSomething(CatchSomething))
    o.OnSomething += CatchSomething;

但是,您需要更新CheckOnSomething以接受特定的委托类型,以便可以转换CatchSomething

代码语言:javascript
运行
复制
public bool CheckOnSomething(Action<object, string> handler)
    => this.OnSomething.IsRegistered(handler);

这也提高了类型安全性,因为现在只有具有正确签名的委托才能传递.

如果我定义了一个新的委托,那么委托平等是否有效?文档说它检查委托类型,但是由于我直接传递方法,难道新的委托类型不是在动态创建的情况下创建的,这将使等式始终返回false吗?

传递方法将创建一个新的委托实例,而不是新的委托类型;委托类型将始终为Action<object, string>

但是,委托平等依赖于目标和类型,因此只有当传递的CatchSomething来自同一个实例时才会被认为是相等的。

例如:

代码语言:javascript
运行
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66382998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档