所有具有特定接口的类都应该按事件通知

时间:2015-04-16 06:38:53

标签: c# 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;

}

我希望一级和二级都能得到通知,并且当事件被调用时,我感觉某个地方我错了方向,是否有可能做到?

2 个答案:

答案 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);
        }
    }
}

然后让您的OneTwo个对象注册到该事件,并在其中传递一个签名与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;
}