Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事件集合_C#_.net_Events_Collections - Fatal编程技术网

C# 事件集合

C# 事件集合,c#,.net,events,collections,C#,.net,Events,Collections,我在c#中使用事件作为发布者/订阅者模式。然而,我不知道在设计时我的程序将使用多少出版商。我想动态地将事件直接添加到类中,或者更合理地添加到包含事件的集合/字典中 使用C#?创建一个中介,您的发布者向其发布,您的订阅者向其订阅,这两种情况都是可能的。例如: public class Mediator { public static readonly Mediator Current = new Mediator(); public event EventHandler<Ev

我在c#中使用事件作为发布者/订阅者模式。然而,我不知道在设计时我的程序将使用多少出版商。我想动态地将事件直接添加到类中,或者更合理地添加到包含事件的集合/字典中


使用C#?

创建一个中介,您的发布者向其发布,您的订阅者向其订阅,这两种情况都是可能的。例如:

public class Mediator
{
    public static readonly Mediator Current = new Mediator();
    public event EventHandler<EventArgs> EventRaised;
    public void RaiseEvent(object sender, EventArgs eventArgs)
    {
        if (EventRaised!=null) 
            EventRaised(sender, eventArgs);
    }
}
public class PublisherEventArgs : EventArgs
{
    public string SomeData { get; set; }
}
public class Publisher
{
    public void Publish(string data)
    {
        Mediator.Current.RaiseEvent(this, new PublisherEventArgs() { SomeData = data} );
    }
}
public class Subscriber
{
    public Subscriber()
    {
        Mediator.Current.EventRaised += HandlePublishedEvent;
    }

    private void HandlePublishedEvent(object sender, EventArgs e)
    {
        if(e is PublisherEventArgs)
        {
            string data = ((PublisherEventArgs)e).SomeData;
            // todo: do something here
        }
    }
}
公共类中介程序
{
public static readonly Mediator Current=new Mediator();
公共事件处理程序事件已引发;
public void RaiseEvent(对象发送方,事件参数EventArgs)
{
if(EventRaised!=null)
EventRised(发送方、eventArgs);
}
}
公共类PublisherEventArgs:EventArgs
{
公共字符串SomeData{get;set;}
}
公共类出版商
{
公共无效发布(字符串数据)
{
Mediator.Current.RaiseEvent(这是一个新的PublisherEventArgs(){SomeData=data});
}
}
公共类订户
{
公共用户()
{
Mediator.Current.EventRaised+=HandlePublishedEvent;
}
私有void HandlePublishedEvent(对象发送方,事件参数e)
{
如果(e是PublisherEventArgs)
{
字符串数据=((PublisherEventArgs)e).SomeData;
//托多:在这里做点什么
}
}
}

确保在订阅服务器上实现IDisposable(在我的示例中不是这样),以便它在dispose期间从中介取消订阅。

您需要断开事件源的连接才能执行此操作。这通常通过事件聚合器完成;它管理希望发布事件的客户端以及希望订阅事件的客户端。所有这些都将发布者与监听器分离,并允许您执行所描述的操作


您可以在
IEventAggregator
界面的形式中使用现成的。如果您在设计时不知道,那么在运行时也不会知道。我只能想象你把它倒过来了,你不知道一个事件会有多少订阅者,我会在运行时知道。该软件用于在模拟中传递消息,其概念是,模拟世界中的每个区域都有一个发布者,但区域的数量未知,因为总空间在设计时并不固定。每个区域在运行时从磁盘加载,每个区域都有一个发布服务器。但是,下面发布的中介解决方案可能是合适的。我需要深入探讨它,但它似乎是一个很好的解决办法