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

标签 c# events delegates

假设我有 2 个类,classA 和 classB。对象 A(A 类)包含一些对象 B(B 类)。 B 对象有一个事件,对象 A 订阅了一个委托(delegate),该委托(delegate)在(任何 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)这样用很常见吗?

最佳答案

我觉得你把你的 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 的建议进行操作。但同样 - 我会传递回调,而不是类本身。

另一种选择 - 如果您觉得需要多个方法并且觉得传递一打回调很尴尬 - 考虑传递一个接口(interface),其中包含您需要的方法。

关于c# - 在订阅另一个对象事件的委托(delegate)中使用(对象发送者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18432388/

相关文章:

WPF DataGrid 列 : how to manage event of value changing

javascript - 在鼠标悬停时显示/隐藏 div 不起作用

c# - "Universal"控制(大致)任何类型的属性?

events - 我应该允许插件使我的应用程序崩溃吗?

events - F# 中的 Control.Observable 和 Control.Event 模块之间有什么相似之处/不同之处?

iOS : dealloc is not getting called if strong delegate set to self

swift - 在单独的类 Swift 中委托(delegate)

C# MongoDB 索引导致奇怪的重复异常

c# - 使用转义字符/特殊字符/格式计算字符串的长度

c# - HTML - 我如何知道所有框架何时加载?