2012-05-12 12 views
6

Sto cercando di costruire un oggetto che utilizza System.ComponentModel.ISynchronizeInvoke, che ha il metodo: (tra gli altri)Invocare System.Delegate oggetto di classe in C#

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

Qual è il modo migliore per chiamare il metodo con gli argomenti dati? Posso usare:

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

Ma questo è in ritardo. Il mio istinto è che questo è l'unico modo per chiamare il metodo .. Qualche idea?

+3

Attenzione che si stanno facendo promesse piuttosto rigide quando si implementa l'interfaccia. In realtà ci si aspetta che * sincronizzi * il codice. Concentrati sull'implementazione della proprietà InvokeRequired, quella dura. –

risposta

4

Penso che sia logicamente impossibile che sia diversamente. Il delegato method può incapsulare un metodo di qualsiasi firma (con qualsiasi numero e tipo di parametri e qualsiasi tipo di valore restituito o nulla). L'unico modo per risolvere la propria firma e invocarla con gli argomenti forniti (dopo aver verificato che sono della quantità e del tipo corretti) sarebbe in fase di esecuzione attraverso la riflessione.

Se non si implementava l'interfaccia ISynchronizeInvoke e si poteva definire il proprio metodo, è possibile limitare l'argomento method per accettare solo i delegati del metodo di una particolare firma; in tal caso, puoi invocarli direttamente.

Ad esempio, per eseguire i metodi che non prendono i parametri e che hanno un valore di ritorno, si può usare:

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

Per eseguire un metodo che prende tre parametri e non ha alcun valore di ritorno, si usa:

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

Dopo aver scavato un po 'di più, sì, questa è la conclusione a cui sono giunto. Grazie per la risposta concisa. – Rob

Problemi correlati