手动调用事件处理程序

时间:2011-01-31 22:42:46

标签: c# event-handling

我有一个事件处理程序方法,它直接作为标准方法调用。也就是说,它不仅在我的事件发生时调用,而且还作为私有方法调用。

UtilStk.StkRoot.OnStkObjectAdded += new 
    IAgStkObjectRootEvents_OnStkObjectAddedEventHandler(TallyScenarioObjects);

private void TallyScenarioObjects(object sender)
{
    ...
}

直接调用此处理程序时是否适合传递null参数?

TallyScenarioObjects(null);

3 个答案:

答案 0 :(得分:17)

将公共逻辑封装到另一个可以从事件处理程序调用的方法中:

UtilStk.StkRoot.OnStkObjectAdded += new IAgStkObjectRootEvents_OnStkObjectAddedEventHandler(TallyScenarioObjects);

private void TallyScenarioObjects(object sender)
{
    DoStuff();
}

private void DoStuff() { ... }

private void AnotherMethod()
{
    DoStuff();
}

那就是说,你的处理程序一个方法,没有什么特别之处,所以你总是可以伪装参数并直接调用它。我不会去那条路。

答案 1 :(得分:6)

是的,这样可行,但是更好的做法是拥有一个可以直接调用或从事件处理程序调用的第二个方法:

UtilStk.StkRoot.OnStkObjectAdded += new IAgStkObjectRootEvents_OnStkObjectAddedEventHandler(TallyScenarioObjects);

private void TallyScenarioObjects(object sender)
{
     DoTally(....);
}

private void DoTally(....)
{
}

如果没有别的,你不会混淆其他开发人员,他们不会期望看到这样的事件处理程序。

答案 2 :(得分:1)

我同意其余的意见。让您的事件调用方法。然后,您可以从任何地方调用该方法。

UtilStk.StkRoot.OnStkObjectAdded += new IAgStkObjectRootEvents_OnStkObjectAddedEventHandler(TallyScenarioObjects);

private void TallyScenarioObjects(object sender)
{
    MyMethod();
}

private  void MyMethod()
{
    //Code here.
}