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

本文关键字:对象 一个对象 事件 | 更新日期: 2023-09-27 18:29:02

假设我有两个类,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();
    }

因此,我实际上是在使用发送方在事件发生后调用对象B上的特定方法。我这样做是为了避免将一些从设计角度来看不应该在objectB中的objectA成员传递给objectB(在他的构造函数中)。这是合理的处理方式吗?以这种方式使用(object sender)是否常见?

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

我认为您的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和Inherit from EventArgs的建议进行操作。但是,我会再次传入回调,而不是类本身。

另一种选择是,如果您觉得需要多个方法,并且在传递十几个回调时感到尴尬,可以考虑传递一个包含所需方法的接口。

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

这是的另一个解决方案

步骤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属性的值

样品:

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

为什么不创建自己的EventArgs类并将B放入其中?

类似:

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