.NET では、ラムダ式を Expression<> に簡単に変換できます。 Expression クラスを使用します。ただし、Func
次のコードを考えてみましょう:
public void GimmeExpression(Expression<Func<T>> expression) { ((MemberExpression)expression.Body).Member.Name; // "DoStuff" } public void SomewhereElse() { GimmeExpression(() => thing.DoStuff()); }
ここでは、ラムダ式が GimmeExpression メソッドに渡され、その名前が抽出されます。メソッドが呼び出されています (DoStuff)。
ここで、同様の操作を実行するとします。制限されたコンテキスト:
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()); }
この場合、dangerCall Func
Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>'. An explicit cast does not resolve the situation.
これは、Func
必要なデータが最適化されていない場合、中間言語 (IL) を逆アセンブルして元の式を推論すると、この変換が可能になる可能性があります。ただし、これは複雑で信頼性が低い可能性のあるアプローチです。
以上が.NET 関数を式に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。