2011-01-31 19 views
9

Mam metodę obsługi zdarzeń, która jest wywoływana bezpośrednio jako standardowa metoda. Oznacza to, że nie jest wywoływana tylko wtedy, gdy moje zdarzenie ma miejsce, ale także jako metoda prywatna.Ręczne wywoływanie procedury obsługi zdarzeń

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

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

Czy można przekazać zerowy argument podczas bezpośredniego wywoływania tego handler'a?

TallyScenarioObjects(null); 
+0

tak długo, jak obsługi zdarzeń obsługuje wartość null –

+1

Zobacz także http://stackoverflow.com/questions/4684513/how-to-trigger-a-timer-tick-programatically/4684566#4684566 - bezpośrednio wywoływanie programów obsługi zdarzeń, takich jak ten, jest zapachem kodu. – Bevan

Odpowiedz

17

Wystarczy hermetyzacji wspólnej logiki do innej metody, które mogą być wywoływane z programu obsługi zdarzeń:

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

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

private void DoStuff() { ... } 

private void AnotherMethod() 
{ 
    DoStuff(); 
} 

Powiedział, że Twój obsługi jest metoda, nie ma nic szczególnego w tym, więc może zawsze wstawiać argumenty i wywoływać je bezpośrednio. Ale nie pójdę tą drogą.

6

Tak, że będzie działać, ale byłoby lepiej praktyka mieć 2nd metodę, która mogłaby zostać wywołana bezpośrednio lub z obsługi zdarzenia:

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

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

private void DoTally(....) 
{ 
} 

Jeżeli nic innego nie pomyli innych deweloperów, który wygrał Nie spodziewaj się, że w ten sposób zostanie wywołany moduł obsługi zdarzeń.

1

Zgadzam się z resztą. Niech twoje wywołanie zdarzenia jest metodą. Następnie możesz wywołać tę metodę z dowolnego miejsca.

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

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

private void MyMethod() 
{ 
    //Code here. 
} 
Powiązane problemy