Inverse de l&#39;expression <Func<T,TResult> &gt; .Compile ()?

.net c# expression-trees lambda linq

Question

Puisque nous pouvons:

Expression<Func<int, bool>> predicate = x => x > 5;
var result = Enumerable.Range(0,10).Where(predicate.Compile());

Comment puis-je:

Expression<Func<int, bool>> predicate = x => x > 5;
var result = Enumerable.Range(0,10).Where(predicate.Compile());

C'est-à-dire que je veux obtenir l' Expression correspondante du Func . C'est possible?

Réponse acceptée

Il n'y a pas de magie Decompile() pour une instance de délégué , à moins de déconstruire l'IL (peut-être avec mono.cecil). Si vous voulez un arbre d’expression, vous devez commencer par un arbre d’expression. Optez donc pour Expression<Func<int, bool>> througout.

En tant que cas limite, vous pouvez obtenir de l' information des délégués de la méthode de base de du délégué .Method (le MethodInfo ) et .Target (le arg0 ) - cependant, la plupart des scénarios un lambda ou une méthode anonyme pointera à la méthode de compilateur générer sur la classe de capture, donc ne vous aidera pas vraiment beaucoup. Il est quasiment limité à des scénarios tels que:

Func<string,int> parse = int.Parse;

Réponse populaire

Passez le lambda à une méthode qui accepte un Expression <> et le compilateur C # vous transmettra un arbre d’expression au moment de l’exécution. Toutefois, cela ne fonctionne que si vous transmettez directement le lambda, et non si vous essayez de transmettre une instance de délégué créée à partir d'un lambda.

var exp = Decompile(x => x > 5);

public Expression<Func<int, bool>> Decompile(Expression<Func<int, bool>> exp)
{
    return exp;
}

L'option la plus proche que j'ai trouvée pour décompiler une instance de délégué est détaillée dans ce billet de blog de Jean-Baptiste Evain, qui travaille dans l'équipe Mono . Il utilise l'excellent projet Mono.Cecil pour décompiler l'IL en un AST personnalisé, puis le mappe au mieux dans les expressions LINQ.




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