2012-05-12 26 views
6

Estoy tratando de construir un objeto que utiliza System.ComponentModel.ISynchronizeInvoke, que tiene el método: (entre otros)objeto de clase Invocación System.Delegate en C#

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

¿Cuál es la mejor manera de llamar la método con los argumentos dados? Puedo usar:

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

Pero esto está retrasado. Mi intuición es que esta es la única forma de llamar al método ... ¿Alguna idea?

+3

Tenga en cuenta que está haciendo promesas bastante rígidas cuando implemente la interfaz. En realidad, se espera que * sincronice * el código. Primero concéntrese en implementar la propiedad InvokeRequired, esa es la difícil. –

Respuesta

4

Creo que es lógicamente imposible que sea de otra manera. El delegado method puede encapsular un método de cualquier firma (con cualquier número y tipo de parámetros, y cualquier tipo de valor devuelto o nulo). La única forma de resolver su firma e invocarla con los argumentos suministrados (después de verificar que son de la cantidad y el tipo correctos) sería en tiempo de ejecución a través de la reflexión.

Si no estaba implementando la interfaz ISynchronizeInvoke y podría definir su propio método, entonces podría restringir su argumento method para aceptar solo delegados de métodos de una firma en particular; en ese caso, podría invocarlos directamente.

Por ejemplo, para ejecutar métodos que no tienen en parámetros y tienen un valor de retorno, se debería utilizar:

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

Para ejecutar un método que utiliza tres parámetros y no tiene ningún valor de retorno, se debería utilizar:

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

Después de investigar un poco más, sí, esta es la conclusión a la que he llegado también. Gracias por la breve respuesta. – Rob

Cuestiones relacionadas