我试图正确地检查对象的事件是否已经设置为特定的方法。
堆叠溢出问题提供了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吗?发布于 2021-02-26 09:43:14
为了调用
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; // falsehttps://stackoverflow.com/questions/66382998
复制相似问题