Problèmes Expression vs Predicate

.net-3.5 c# expression-trees lambda

Question

J'ai un peu de mal à créer un arbre d'expression pour représenter une requête de l'utilisateur. Étant donné que je n'ai pas le temps de créer tous les cas possibles de saisie de l'utilisateur, j'ai pensé que les arbres d'expression me permettraient de résoudre ce problème.

Pour la plupart, il a. Je suis cependant un peu perplexe. Je suis dans le code ci-dessous essayer d'exécuter un List.Find avec une expression créée dynamiquement. En bref, l'expression est la suivante:

list.Find(m => m.ListOfStrings.Exists(s => s == "cookie"));

où m est

list.Find(m => m.ListOfStrings.Exists(s => s == "cookie"));

J'ai eu jusqu'à créer

list.Find(m => m.ListOfStrings.Exists(s => s == "cookie"));

avec des expressions, pas de problème. J'ai aussi déclaré un methodinfo pour Exists

list.Find(m => m.ListOfStrings.Exists(s => s == "cookie"));

Le seul problème que j'ai est de créer une expression pour invoquer ladite méthode avec le lambda en tant que paramètre tel que

list.Find(m => m.ListOfStrings.Exists(s => s == "cookie"));

Il donne une exception compréhensible que

list.Find(m => m.ListOfStrings.Exists(s => s == "cookie"));

Comment diable puis-je surmonter cela?

Code complet:

list.Find(m => m.ListOfStrings.Exists(s => s == "cookie"));

Réponse acceptée

Les délégués ont différents types:

public delegate bool Predicate<T>(T obj);
public delegate TResult Func<T, TResult>(T arg);

La méthode Exists (et la Find ) s’attendent à Predicate<T> . L'expression Lambda est compilée au moment de l'exécution en Func<T, TResult> .

Essayez ce qui suit:

public delegate bool Predicate<T>(T obj);
public delegate TResult Func<T, TResult>(T arg);

Vous pouvez également utiliser la fonction Lambda générique:

public delegate bool Predicate<T>(T obj);
public delegate TResult Func<T, TResult>(T arg);

Réponse populaire

Si vous regardez le message, il vous dit que Predicate n'est pas compatible avec Func.

Maintenant, Predicate est défini comme tel:

public delegate bool Predicate<T>(
    T obj
)

et vous avez Func en tant que tel:

public delegate bool Predicate<T>(
    T obj
)

Ensemble, vous essayez de rendre ces 2 délégués compatibles:

public delegate bool Predicate<T>(
    T obj
)

C'est à dire. chaîne! = MyClass.

J'espère que cela avait du sens.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi