代码之家  ›  专栏  ›  技术社区  ›  Gavin

C#委托和事件设计帮助

  •  1
  • Gavin  · 技术社区  · 17 年前

    我在考虑允许其他方法订阅此事件,这样我就可以根据需要添加更多内容。我的想法是创建一个允许其他方法注册的委托数组,然后在对象保存后,它可以循环遍历委托并调用每个委托。

    谢谢

    6 回复  |  直到 17 年前
        1
  •  1
  •   Keith    17 年前

    事件委托是多播的,这意味着它们可以保存对多个事件处理方法的引用-请参阅MSDN文档 Delegate 和 MulticastDelegate .

    订阅事件的语法给出了一个线索:

    MyEvent += MyHandler; // subscribe to an event
    MyEvent -= MyHandler; // unsubscribe from an event
    
        2
  •  2
  •   Vinay Sajip    17 年前

    您可以为单个事件订阅任意数量的代理。引擎盖下。无论如何,Net都会将这些作为有序集合保存。

    标准模式如下:

    //in your class
    public EventHandler<MyEvtArgs> MyEvent;
    
    protected void OnMyEvent ( MyEvtArgs args ) {
        if(MyEvent != null) //make sure there is at least 1 subscriber
            MyEvent(this, args);
    }
    

    然后称之为:

    var myInstance = new MyClass();
    
    // all of these can convert to EventHandler<MyEvtArgs> (object, MyEvtArgs)
    myInstance.MyEvent += (sender, e) => { /* do something 1 */ };
    
    myInstance.MyEvent += (sender, e) => { /* do something 2 */ };
    
    myInstance.MyEvent += localMethod;
    

    现在,当在类中调用受保护的OnMyEvent方法时,所有这些事件都将按顺序触发。

    您还可以从此集合中删除项目:

    myInstance.MyEvent -= localMethod;
    
        3
  •  1
  •   Preet Sangha    17 年前

    你不需要数组。让任何人都订阅一个。

        4
  •  0
  •   PVitt    17 年前

    您可以为此使用正常事件。运行时将处理所有字段的循环。

    public event EventHandler<EventArgs> WritingToDatabaseFinished;
    
    protected void OnWritingToDatabaseFinished(EventArgs args)
    {
        EventHandler<EvetnArgs> handler = WritingToDatabaseFinished;
        if (handler != null)
        {
            handler(this, args);
        }
    }
    

    您的代码调用

    OnWritingToDatabaseFinished(args);
    

    所有需要通知的方法都必须注册到事件中:

    WritingToDatabaseFinished += new EventHandler<EventArgs>(handlermethod);
    

    当您调用OnWritingToDatabaseFinished时,将调用以上述方式注册的每个处理程序。

        5
  •  0
  •   Pete OHanlon    17 年前

    您只需要一个多播代理。你根本不需要数组。您可以使用+=添加对委托的引用,使用-=删除引用。

    我建议您考虑使用弱事件处理程序。看一看 this link 了解为什么要使用弱事件而不是弱委托。

        6
  •  0
  •   Rodrigo Garcia    17 年前

    代理已经是多播的,因此不需要代理数组。现在,向类添加事件支持的推荐方法是:

    1. 添加一个公共委托(这将是您的事件处理程序)

    公共委托void DatabaseEventHandler(对象发送方,Databasenvarchar e);

    公共事件数据库事件处理程序数据库完成;

    现在,事件应该发送2个参数。发件人( this ,通常)和nvarchar。您应该从System创建一个新类。args,并在该类中发送相应的信息。