2009-12-09 5 views
9

Je suis intéressé par l'écriture d'une méthode qui accepterait une autre méthode en tant que paramètre mais qui ne veut pas être verrouillée dans une signature spécifique - parce que cela m'est égal. Je suis seulement intéressé si la méthode jette une exception lorsqu'elle est invoquée. Y a-t-il une construction dans le .NET Framework qui me permettra d'accepter n'importe quel délégué en tant que paramètre?Comment accepter n'importe quel délégué en tant que paramètre

Par exemple, tous les appels suivants devraient fonctionner (sans utiliser les surcharges!):

DoesItThrowException(doSomething(arg)); 
DoesItThrowException(doSomethingElse(arg1, arg2, arg3, arg4, arg5)); 
DoesItThrowException(doNothing()); 
+0

Comment testez-vous pour voir si la méthode renvoie une exception? Si vous avez l'intention de le coller dans un bloc 'try'-'catch' et de l'invoquer, vous devrez toujours lui fournir des paramètres. –

Répondre

3
bool DoesItThrowException(Action a) 
{ 
    try 
    { 
    a(); 
    return false; 
    } 
    catch 
    { 
    return true; 
    } 
} 

DoesItThrowException(delegate { desomething(); }); 

//or 

DoesItThrowException(() => desomething()); 
10

Vous ne pouvez invoquer à moins que vous ne donnez des arguments; et vous ne pouvez pas lui donner d'arguments à moins que vous connaissiez la signature. Pour contourner ce problème, je place ce fardeau sur l'appelant - j'utiliser Action et anon-méthodes/lambdas, à savoir

DoesItThrowException(FirstMethod); // no args, "as is" 
DoesItThrowException(() => SecondMethod(arg)); 
DoesItThrowException(() => ThirdMethod(arg1, arg2, arg3, arg4, arg5)); 

Sinon, vous pouvez utiliser Delegate et DynamicInvoke, mais qui est lent et vous devez savoir quels args pour le donner.

public static bool DoesItThrowException(Action action) { 
    if (action == null) throw new ArgumentNullException("action"); 
    try { 
     action(); 
     return false; 
    } catch { 
     return true; 
    } 
} 
+0

Avec la syntaxe démontrée dans la question, il est clair que lambda est le seul choix viable - il ne veut pas vraiment passer un délégué autant qu'une méthode avec tous les paramètres liés. –

+0

@Pavel: Vous aurez besoin d'un «meilleur» langage pour cela, comme Scheme par exemple, qui permet l'abstraction syntaxique. – leppie

+0

Pourquoi «mieux» et pas seulement «mieux»? Le régime est vraiment meilleur. –

Questions connexes