2010-10-20 8 views
1

J'ai une méthode avec deux surcharges, comme suit:Comment enchaîner les surcharges de méthode qui acceptent les délégués Func <>? (C#)

bool Evaluate(Func<bool> condition) 
{ 
    // Some logic 

    return condition.Invoke(); 
} 

bool Evaluate<T>(Func<T, bool> condition, T value) 
{ 
    // Same logic as the first method overload 

    return condition.Invoke(value); 
} 

Puisque les deux surcharges de méthode contiennent une logique largement identique, je leur souhaite enchaîner ensemble, mais je ne vois pas comment faire cela. J'imagine que la première méthode de surcharge a besoin de construire un délégué qu'elle passe à la deuxième surcharge, mais la forme que devrait prendre ce délégué n'est pas claire.

Un grand merci pour vos conseils,

Tim

Répondre

6

Essayez ceci (vous n'avez pas besoin d'appeler Invoke):

bool Evaluate(Func<bool> condition) { 
    // logic ... 
    return condition(); 
} 

bool Evaluate<T>(Func<T, bool> condition, T value) { 
    return Evaluate(() => condition(value)); 
} 

Ou peut-être votre logique est réutilisable, il peut être judicieux de l'extraire dans sa propre méthode:

bool Evaluate(Func<bool> condition) { 
    Logic(); 
    return condition(); 
} 

bool Evaluate<T>(Func<T, bool> condition, T value) { 
    Logic(); 
    return condition(value); 
} 

void Logic() { 
    // logic... 
} 
+0

Ha! Je viens de poster * exactement * la même réponse. Mais tu m'as battu au coup de poing donc +1. – LukeH

+0

Merci à tous pour leurs réponses rapides et concises. En fait, toutes ces réponses auraient résolu mon problème mais je ne peux en choisir qu'une. –

1

Quelque chose comme ceci:

bool Evaluate(Func<bool> condition) 
{ 
    return Evaluate(p => condition.Invoke(), false); 
} 
+0

Oeps, a oublié le faux à la fin. Philip Rieck est juste cela, mais l'inverse :). –

1

Votre première surcharge ne peut pas appeler la seconde à moins que vous allez « compenser » une valeur pour passer . Votre deuxième peut facilement appeler le premier, cependant.

bool Evaluate<T>(Func<T, bool> condition, T value) 
{ 
    return Evaluate(() => condition(value)); 
} 
1

La méthode la plus simple consiste à envelopper le délégué d'origine sans paramètre avec un délégué qui accepte et ignore un seul paramètre.

bool Evaluate(Func<bool> condition) 
{ 
    return Evaluate(_ => condition(), 0); 
} 
Questions connexes