在订阅了另一个对象的事件的委托中使用(对象发送方)
本文关键字:对象 一个对象 事件 | 更新日期: 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; }
}