Cześć,
potrzebuję rozwiązania, które umożliwi mi dynamiczne utworzenie metody do obsługi zdarzenia na podstawie danych z EventInfo. Event handler to Task i chciałbym przepchać wszystkie argumenty utworzonej metody po wystąpieniu zdarzenia z użyciem kodu dalej, ale generalnie utknąłem na etapie budowy takiego handlera.
Na razie testowo zrobiłem 5 metod jak poniżej:
private Task Handler()
{
return UniversalHandler();
}
private Task Handler1(object arg1)
{
return UniversalHandler(arg1);
}
private Task Handler2(object arg1, object arg2)
{
return UniversalHandler(arg1, arg2);
}
private Task Handler3(object arg1, object arg2, object arg3)
{
return UniversalHandler(arg1, arg2, arg3);
}
private Task Handler4(object arg1, object arg2, object arg3, object arg4)
{
return UniversalHandler(arg1, arg2, arg3, arg4);
}
private Task Handler5(object arg1, object arg2, object arg3, object arg4, object arg5)
{
return UniversalHandler(arg1, arg2, arg3, arg4, arg5);
}
private Task UniversalHandler(params object[] args)
{
// Mój kod
return Task.CompletedTask;
}
Subskrypcję dodaję z użyciem switch case zależnie od liczby argumentów wyciągniętych z EventInfo.
switch (amountOfArgs)
{
case 1:
eventInfo.AddEventHandler(instance, Handler1);
SetRemoveHandlerAction(eventInfo, Handler1, instance);
break;
Kod powyżej działa bez zarzutu z argumentami niegenerycznymi. Oczwiście nie zadziała z generycznymi no i nie mogę mieć pewności, że w przyszłości nie będę potrzebował obsługi np. 6, albo 10 argumentów. Oczywiście jest to mało prawdopodobne, ale niedosyt, że to tak wygląda pozostaje.
Kod jest wpięty do zbudowanego diagramu. Mam bloki, ktore reprezentują klasy. Po dodaniu bloku reprezentującym instancję danej klasy, można ją wpiąć do bloku odpowiedzialnego za wyciąganie zdarzeń, a wybrane zdarzenie wpiąć do bloku generowania argumentów. Argumenty można wpiąć dalej, np do bloków funkcyjnych lub innych klas. W momencie wystąpienia zdarzenia, zbudowana w diagramie logika wykonuje się.
Wszystko zdaje się działać do momentu wpięcia zdarzenia z argumentem np. Myclass<MyOtherClass,int> arg. Tu kod się wysypie bo AddEventHandler oczywiście nie zadziała.
Nie chciałem budować zbyt wielu bloków do diagramu ręcznie, więc większość jest zbudowana przez reflection. Niestety myślałem, że z eventami będzie mi najłatwiej, ale okazało się, że było z nimi najwięcej zachodu. To jest jedyny mankament, który odłożyłem na późniem, bo nie mogę sobie z nim porawdzić. Próbowałem użyć:
Delegate.CreateDelegate()
Niestety on potrzebuje MethodInfo, a ja przecież nie mam metody. Myślałem więc o DynamicMethod, ale w ogole nie mam pojęcia jak tam wepchnąć body z kodem. Może ktoś coś poradzi, albo odeśle w jakieś sensowne miejsce gdzie coś podobnego jest na jakimś samplu, bo za długo już grzebię w Internecie i szukam, aktoś mógł coś podobnego ogarniać wcześniej lub gdzieś się na to natknął. Dzięki z góry za pomoc i pozdrawiam :)