ホームページ >バックエンド開発 >C++ >.NET 関数を式に変換するにはどうすればよいですか?

.NET 関数を式に変換するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-05 16:20:40281ブラウズ

How to Convert a .NET Func to an Expression?

.NET 関数の変換 .NET 式へ>

.NET では、ラムダ式を Expression<> に簡単に変換できます。 Expression クラスを使用します。ただし、Func を変換したい場合もあるかもしれません。 Expression> に戻します。

次のコードを考えてみましょう:

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 を変換しようとします。 Expression> に変換しましたが、コンパイル時エラーが発生しました:

Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>'. An explicit cast does not resolve the situation.

これは、Func が原因です。は式ではなく一般的なデリゲートを表します。コンパイラはラムダを Expression<> に魔法のように変換できます。オブジェクトの場合、この変換は一般的な Func では不可能です。 object.

必要なデータが最適化されていない場合、中間言語 (IL) を逆アセンブルして元の式を推論すると、この変換が可能になる可能性があります。ただし、これは複雑で信頼性が低い可能性のあるアプローチです。

以上が.NET 関数を式に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。