2009-12-11 16 views
6

Tengo el siguiente método de firma:Comprobar si un `object [] args` satisface una instancia Delegate?

public static void InvokeInFuture(Delegate method, params object[] args) 
{ 
    // ... 
} 

El delegado y los argumentos se guardan en una colección para una futura invocación.

¿Hay alguna manera de verificar si la matriz de argumentos satisface los requisitos del delegado sin invocarla?

Gracias.

EDIT: Gracias por la implementación de la reflexión, pero estoy buscando una forma integrada de hacerlo. No quiero reinvertir la rueda, .NET Framework ya tiene esta comprobación implementada dentro de Delegate.DynamicInvoke() en alguna parte, implementación que maneja todos esos casos especiales locos que solo los desarrolladores de Microsoft pueden pensar, y pasó Pruebas unitarias y Control de calidad. ¿Hay alguna forma de utilizar esta implementación incorporada?

Gracias.

Respuesta

6

Puede usar la reflexión para obtener la firma del método del delegado de la siguiente manera.

using System; 
using System.Reflection; 

bool ValidateDelegate(Delegate method, params object[] args) 
{ 
    ParameterInfo[] parameters = method.Method.GetParameters(); 
    if (parameters.Length != args.Length) { return false; } 

    for (int i = 0; i < parameters.Length; ++i) 
    { 
     if (parameters[i].ParameterType.IsValueType && args[i] == null || 
      !parameters[i].ParameterType.IsAssignableFrom(args[i].GetType())) 
     { 
      return false; 
     } 
    } 

    return true; 
} 
+0

se me adelantó, y ha tenido un ejemplo de código! +1 para una respuesta completa a esta pregunta. –

+1

Su código no maneja la herencia, por ejemplo, un argumento de tipo FileStream es un argumento válido de Stream. Su código puede funcionar, pero el hecho es que CLR puede verificarlo él mismo dentro del delegado. Invoque(). ¿Hay alguna manera de reutilizar el código de comprobación de CLR? Quiero ser totalmente coherente con el CLR. – DxCK

+1

Nota: no debe verificar el tipo como este, ya que esto arrojará falso para las instancias variantes (por ejemplo, un delegado que acepte 'object' devolverá false si pasa una' cadena' o cualquier otra cosa). Sugeriría usar 'parameters [i] .ParameterType.IsAssignableFrom (args [i] .GetType())' y adicionalmente agregaré checks para el tipo de valor y 'null' (' args [i] .getType() 'fallará si 'args [i]' es 'nulo'). – Lucero

1

Parece que el framework básicamente hace lo anterior, con cierta lógica de eliminación para asegurarse de que mantiene una lista de los ya evaluados.

Cuestiones relacionadas