Ooh, c'est pas du tout facile. Func<T>
représente un générique delegate
et non pas une expression. Si il n'y a aucune façon vous pouvez le faire (en raison d'optimisations et d'autres choses faites par le compilateur, certaines données peuvent être jetés, de sorte qu'il peut être impossible d'obtenir l'expression d'origine à l'arrière), ce serait de démonter le IL à la volée et en déduire l'expression (ce qui n'est pas facile). Le traitement des expressions lambda comme données (Expression<Func<T>>
) est une magie faite par le compilateur (en gros, le compilateur crée une arborescence d'expression dans le code au lieu de le compiler à l'IL).
Liées fait
C'est pourquoi les langues qui poussent les lambdas à l'extrême (comme Lisp) sont souvent plus faciles à mettre en œuvre que des interprètes. Dans ces langues, le code et les données sont essentiellement la même chose (même au moment de l'exécution), mais notre puce ne peut pas comprendre que la forme de code, nous avons donc pour émuler une machine de ce type par la construction d'un interprète sur le dessus de ce qui la comprend (le choix fait par Lisp comme langues) ou sacrifier la puissance (le code ne sera plus exactement égale à données) dans une certaine mesure (le choix fait par C#). En C#, le compilateur donne l'illusion de traitement de code de données en permettant lambdas être interprété comme code (Func<T>
) et de données (Expression<Func<T>>
) au moment de la compilation.