如何调用接口声明的事件,以便所有已实现该接口的类得到通知?
例如在这样的结构中,
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;
}
我希望一级和二级都能得到通知,并且当事件被调用时,我感觉某个地方我错了方向,是否有可能做到?
答案 0 :(得分:1)
实际上你想要的并不涉及事件。实现IEventCaller
的对象将使用事件来通知某个对象持有对该对象的引用的某些更改。要在实现IEventCaller
的对象上调用某些内容,只需要一个方法,例如Hello()
;
首先,您需要能够通知所有实现此接口的对象的代码。为了实现这一点,您需要存储想要的实例列表以获得通知。
一种解决方案是创建一个管理该列表的类。我们这样说吧
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();
}
答案 1 :(得分:1)
我想你可能正在看另一个人。
对于事件,您希望拥有一个发布者的对象,该对象负责发布事件并说“嘿伙计们,刚刚发生的事情你应该知道它” ,你有你的订阅者,他们是那些说“哟dawg的人,让我知道这件事何时发生,所以我可以采取行动”。
您可以做的是让负责事件发生的对象实现您的界面:
public class Publisher : IEventCaller
{
public event MyDel MyDeleteEvent;
public void OnDeleteOccured()
{
var myDeleteEvent = MyDeleteEvent;
if (myDeleteEvent != null)
{
MyDeleteEvent(1);
}
}
}
然后让您的One
和Two
个对象注册到该事件,并在其中传递一个签名与MyDel
的委托类型匹配的方法:
public class SubscriberOne
{
public void OnSomethingOccured(int value)
{
Console.WriteLine(value);
}
}
public class SubscriberTwo
{
public void OnSomethingOccured(int value)
{
Console.WriteLine(value);
}
}
注册:
void Main()
{
var publisher = new Publisher();
var subscriberOne = new SubscriberOne();
var subscriberTwo = new SubscriberTwo();
publisher.MyDeleteEvent += subscriberOne.OnSomethingOccured;
publisher.MyDeleteEvent += subscriberTwo.OnSomethingOccured;
}