gpt4 book ai didi

c# - 所有具有特定接口(interface)的类都应该通过事件通知

转载 作者:太空宇宙 更新时间:2023-11-03 21:22:41 26 4
gpt4 key购买 nike

如何调用接口(interface)声明的事件,以便通知所有实现了该接口(interface)的类?

例如在这样的结构中,

public delegate void myDel(int value);

interface IEventCaller{
event myDel myDelEventCall;
}


public Class One : IEventCaller {

public event myDel myDelEventCall;



}


public Class Two : IEventCaller {

public event myDel myDelEventCall;

}

我希望第一类和第二类都得到通知并在事件被调用时采取行动,我感觉我在某个地方走错了方向,有可能吗?

最佳答案

其实你想要的不涉及事件。实现 IEventCaller 的对象将使用事件来通知持有对该对象的某些更改的引用的某个对象。要在实现 IEventCaller 的对象上调用某些东西,只需要一个方法,例如 Hello();

首先,您需要代码通知所有实现此接口(interface)的对象。为了实现这一点,您需要在某个地方存储一个希望收到通知的实例列表。

一个解决方案是创建一个管理该列表的类。这么说吧

private static List<IEventCaller> eventCallers = new List<IEventCaller>();

public static void AddEventCaller(IEventCaller c)
{
eventCallers.Add(c);
}

public static void RemoveEventCaller(IEventCaller c)
{
eventCallers.Remove(c);
}

public static IEventCaller[] EventCallers
{
get { return eventCallers.ToArray() }
}

当然,这段代码需要是线程安全的,等等。我会把所有这些都放到 singleton 中。全局可用。

然后,所有实现 IEventCallers 的对象都需要相应地注册/取消注册。因此,我也会让他们实现 IDisposable,这样您就可以在构造函数中执行

public EventCallable()
{
Singleton.Instance.AddEventCaller(this);
}

Dispose 方法中,您可以这样做:

public void Dispose(bool disposing)
{
Singleton.Instance.RemoveEventCaller(this);
}

现在应该通知每个实例的代码可以这样做:

public void NotifyAll()
{
foreach (IEventCaller caller in Singleton.Instance.EventCallers)
caller.Hello();
}

关于c# - 所有具有特定接口(interface)的类都应该通过事件通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29667091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com