Dans .NET, une expression lambda peut être facilement convertie en une expression<> en utilisant la classe Expression. Cependant, il peut y avoir des cas où l'on souhaite convertir un Func
Considérez le code suivant :
public void GimmeExpression(Expression<Func<T>> expression) { ((MemberExpression)expression.Body).Member.Name; // "DoStuff" } public void SomewhereElse() { GimmeExpression(() => thing.DoStuff()); }
Ici, une expression lambda est passée à la méthode GimmeExpression, qui extrait le nom du méthode étant appelée (DoStuff).
Maintenant, supposons que nous voulions effectuer une opération similaire mais dans un cadre restreint context:
public void ContainTheDanger(Func<T> dangerousCall) { try { dangerousCall(); } catch (Exception e) { // This next line does not work... Expression<Func<T>> DangerousExpression = dangerousCall; var nameOfDanger = ((MemberExpression)dangerousCall.Body).Member.Name; throw new DangerContainer( "Danger manifested while " + nameOfDanger, e); } } public void SomewhereElse() { ContainTheDanger(() => thing.CrossTheStreams()); }
Dans ce cas, nous essayons de convertir le dangereuxCall Func
Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>'. An explicit cast does not resolve the situation.
C'est parce que Func
Désassembler le langage intermédiaire (IL) et déduire l'expression originale pourrait permettre cette conversion si les données nécessaires n'ont pas été optimisées. Cependant, il s'agit d'une approche complexe et potentiellement peu fiable.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!