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

C代表和活动设计帮助

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

    我的项目中有一些代码可以将对象保存到数据库中,完成后,我希望它调用一系列其他方法。

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

    这是不好的练习还是有更好的方法?

    谢谢

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

    您可以订阅任意多的委托,只要您想订阅一个事件。不管怎么说,在引擎盖下.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;
    

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

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

    myInstance.MyEvent -= localMethod;
    
        2
  •  2
  •   Vinay Sajip    16 年前

    事件委托是多播的,这意味着它们可以保存对多个事件处理方法的引用-有关 Delegate MulticastDelegate .

    订阅事件的语法提供了一个线索:

    MyEvent += MyHandler; // subscribe to an event
    MyEvent -= MyHandler; // unsubscribe from an event
    
        3
  •  1
  •   Preet Sangha    16 年前

    你不需要阵列。只要让任何人订阅一个。

        4
  •  0
  •   PVitt    16 年前

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

    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    16 年前

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

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

        6
  •  0
  •   Rodrigo Garcia    16 年前

    委托已经是多播的,所以不需要委托数组。现在,向类中添加事件支持的建议方法是:

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

    公共委托void databaseEventHandler(对象发送方,databaseEventArgs e);

    1. 添加委托类型的公共事件。

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

    现在,事件应该发送2个参数。发件人( this ,通常),以及事件参数。您应该从System.EventArgs创建一个新类,并在该类中发送适当的信息。