2009-12-11 4 views
6

J'ai la signature de la méthode suivante:Vérifier si un `object [] args` satisfait une instance Delegate?

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

Le délégué et les arguments sont enregistrés dans une collection pour l'avenir d'invoquer.

Est-il possible de vérifier si le tableau d'arguments satisfait aux exigences des délégués sans l'invoquer?

Merci.

EDIT: Merci pour la mise en œuvre de la réflexion, mais je cherche un moyen intégré de le faire. Je ne veux pas réinvestir la roue, le .NET Framework a déjà cette vérification implémentée dans Delegate.DynamicInvoke() quelque part, une implémentation qui gère tous ces cas spéciaux fous que seuls les développeurs de Microsoft peuvent considérer, et qui ont passé Unit Testing et QA. Est-il possible d'utiliser cette implémentation intégrée?

Merci.

Répondre

6

Vous pouvez utiliser la réflexion pour obtenir la signature de méthode du délégué comme suit.

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

me devança, et vous avez eu un exemple de code! + 1 pour une réponse complète à sa question. –

+1

Votre code ne gère pas l'héritage, par exemple un argument de type FileStream est un argument Stream valide. Votre code peut fonctionner, mais le fait est que CLR peut vérifier est lui-même dans le delegate.Invoke(). Y a-t-il un moyen de réutiliser le code de vérification du CLR? Je veux être entièrement cohérent avec le CLR. – DxCK

+1

Note: vous ne devriez pas vérifier le type comme ceci, car cela retournera false pour les instances variantes (par exemple, un délégué acceptant 'object' retournera false si vous passez un' string' ou quoi que ce soit d'autre). Je suggérerais d'utiliser 'paramètres [i] .ParameterType.IsAssignableFrom (args [i] .GetType())' et d'ajouter des vérifications pour le type de valeur et 'null' (' args [i] .getType() 'va échouer si 'args [i]' est 'null'). – Lucero

1

On dirait que le framework fait essentiellement ce qui précède, avec une certaine logique d'élimination pour vous assurer qu'il conserve une liste de ceux qui ont déjà été évalués.

Questions connexes