1

假设我有 2 个类,A 类和 B 类。对象 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(在他的构造函数中)。这是处理问题的合理方法吗?以这种方式使用 (object sender) 是否常见?

4

3 回答 3

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 继承。但同样 - 我会传入回调,而不是类本身。

另一种选择——如果你觉得你需要多个方法并且对传递十几个回调感到尴尬——考虑传递一个带有你需要的方法的接口。

于 2013-08-25T19:13:35.360 回答
1

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

像:

public class ClassBEventArgs : EventArgs
{
    public classB classBObject { get; set; }
}
于 2013-08-25T19:03:44.993 回答
1

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

这是另一个解决方案

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

对于样品:

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

第 2 步:在 Class 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
     }
}
.......
于 2013-08-25T19:37:50.477 回答