在委托中使用(对象发送者)订阅另一个对象的事件

时间:2013-08-25 18:41:35

标签: c# events delegates

假设我有2个类,classA和classB。对象A(类A)包含一些对象B(类B)。 B对象有一个事件,对象A订阅了一个委托,该委托在引发(任何这些B对象的)事件时执行。

private void fooEventHandler(object sender, EventArgs e)
{
...
}

在fooEventHandler中执行某些操作(必须在A中完成)之后,我想向B对象发出信号,该对象已经引发了我在fooEventHandler中所做的结果。所以我做了以下几点:

private void fooEventHandler(object sender, EventArgs e)  
    {
    ...

        if (allOK)
           ((classB)sender).isOK();
        else
          ((classB) sender).isNotOK();
    }

所以我实际上是在事件上升后使用发送者在objectB上调用特定方法。我正在做这一切以避免传递给objectB(在他的构造函数中)一些objectA成员,从设计的角度来看,它们不应该在objectB中。这是处理问题的合理方法吗?以这种方式使用(对象发送者)是否常见?

3 个答案:

答案 0 :(得分:2)

我认为你的A课程与你的B课程相结合。如果在处理事件后你需要A做的就是调用某个回调 - 然后传递回调。这样,您可以传递lambda表达式,例如,或传递与B或其他相关的类的方法。

所以 -

private void fooEventHandler(Action p_okCallback, Action p_notOkCallback)  
{
    ...

    if (allOK)
       p_okCallback();
    else
      p_notOkCallback();
}

或 -

private void fooEventHandler(Action<bool> p_callback)  
{       
    ...

    p_callback(allOk);
}

如果事件不在您的控制范围内,您可以执行Helmer建议并从EventArgs继承。但是再次 - 我会传递回调,而不是类本身。

另一种选择 - 如果你觉得你需要多种方法并且感觉尴尬地传递十几个回调 - 请考虑使用你需要的方法传递一个接口。

答案 1 :(得分:1)

为什么不创建自己的EventArgs类并将B放在那里?

像:

public class ClassBEventArgs : EventArgs
{
    public classB classBObject { get; set; }
}

答案 2 :(得分:1)

这是一个解决方案,但我认为这不是更好的方法。

这是另一种解决方案

第1步: - 创建一个EventArgs的继承类,并在其上添加一些定义B类处理的属性

样本:

public class ClassBEventArgs : EventArgs
{
    bool treatmentIsOK = false;
}

第2步: 在类B的相同命名空间中,创建一个新的Delegate Event定义并使用它来声明事件

样本:

namespace ClassBNameSpace
{
   public delagate fooEventHandlerDelegate void (object sender, ClassBEventArgs e);

   public ClassB 
   {

   public event fooEventHandlerDelegate fooEventHandler;

   .........

第3步: 在ClassB中,使用ClassBEventArgs对象引发fooEventHandler事件。 在ClassA事件处理程序中设置treatmentIsOK EventArgs的正确值。当事件从ClassA回调到ClassB时,您可以利用treatmentIsOK propertie

的值

样品:

.......
if (this.fooEventHandler != null)
{
    ClassBEventArgs customEventArgs = new ClassBEventArgs();
     this.fooEventHandler (this,customEventArgs);
     if (customEventArgs.treatmentIsOK )
     {
        this.isOK();  ==> Your code
     }
     else
     {
        this.isOK();  ==> Your code
     }
}
.......