2012-05-12 21 views
6

Próbuję zbudować obiekt, który wykorzystuje System.ComponentModel.ISynchronizeInvoke, który ma Metoda: (między innymi)Wywoływanie System.Delegate obiekt klasy w języku C#

public object Invoke(Delegate method, object[] args) 

Jaki jest najlepszy sposób, aby wywołać metoda z podanymi argumentami? Mogę użyć:

public object Invoke(Delegate method, object[] args) 
    { 
     return method.DynamicInvoke(args); 
    } 

Ale to jest późno związane. Instynkt jest taki, że to jedyny sposób na wywołanie metody. Jakieś pomysły?

+3

Pamiętaj, że wprowadzasz niezłe obietnice po wdrożeniu interfejsu. W rzeczywistości oczekuje się * zsynchronizowania * kodu. Skoncentruj się na implementacji właściwości InvokeRequired, która jest trudna. –

Odpowiedz

4

Myślę, że jest to logicznie niemożliwe, aby był jakikolwiek inny sposób. Delegat method może hermetyzować metodę dowolnego podpisu (dowolną liczbą i typem parametrów oraz dowolnym typem wartości zwracanej lub nieważną). Jedyny sposób na rozwiązanie jego podpisu i wywołanie go za pomocą dostarczonych argumentów (po sprawdzeniu, że są one poprawnej ilości i typu) będzie w czasie wykonywania poprzez odbicie.

Jeśli nie implementujesz interfejsu ISynchronizeInvoke i możesz zdefiniować własną metodę, możesz ograniczyć argument method, aby zaakceptować tylko delegatów metody określonego podpisu; w takim przypadku możesz wywołać je bezpośrednio.

Na przykład, aby wykonać metodami, które mają żadnych parametrów i mają wartości zwracanej, należy użyć:

public TResult Invoke<TResult>(Func<TResult> method) 
{ 
    return method(); 
} 

Aby wykonać metodę, która przyjmuje trzy parametry i nie ma wartości zwracanej, należy użyć:

public void Invoke<T1,T2,T3>(Action<T1,T2,T3> method, T1 arg1, T2 arg2, T3 arg3) 
{ 
    method(arg1, arg2, arg3); 
} 
+0

Po trochę więcej kopania, tak, to jest wniosek, do którego również doszedłem. Dziękuję za zwięzłą odpowiedź. – Rob

Powiązane problemy