假设我有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中。这是处理问题的合理方法吗?以这种方式使用(对象发送者)是否常见?
答案 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
}
}
.......