In .NET kann ein Lambda-Ausdruck einfach in einen Ausdruck<> umgewandelt werden. mit der Expression-Klasse. Es kann jedoch Fälle geben, in denen man einen Func
Betrachten Sie den folgenden Code:
public void GimmeExpression(Expression<Func<T>> expression) { ((MemberExpression)expression.Body).Member.Name; // "DoStuff" } public void SomewhereElse() { GimmeExpression(() => thing.DoStuff()); }
Hier wird ein Lambda-Ausdruck an die GimmeExpression-Methode übergeben, die den Namen des extrahiert aufgerufene Methode (DoStuff).
Angenommen, wir möchten einen ähnlichen Vorgang ausführen, jedoch in eingeschränkter Form Kontext:
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()); }
In diesem Fall versuchen wir, die gefährliche Call Func
Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>'. An explicit cast does not resolve the situation.
Dies liegt daran, dass Func
Das Zerlegen der Zwischensprache (IL) und das Ableiten des ursprünglichen Ausdrucks könnte diese Konvertierung ermöglichen, wenn die erforderlichen Daten nicht wegoptimiert wurden. Dies ist jedoch ein komplexer und möglicherweise unzuverlässiger Ansatz.
Das obige ist der detaillierte Inhalt vonWie konvertiere ich eine .NET-Funktion in einen Ausdruck?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!