ホームページ >バックエンド開発 >C++ >MVCパラメータのネストされたプロパティの式を変換するにはどうすればよいですか?

MVCパラメータのネストされたプロパティの式を変換するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-18 06:57:08531ブラウズ

How to Transform Expressions for Nested Properties in MVC Parameters?

MVC パラメーターでネストされた属性式を生成します

目標は、「cust => cust.Name」のような式を「parent =>parent.obj.Name」に変換するメソッドを作成することです。ここで、「parent」はタイプ「T」の MVC モデルの子を表します。フィールド。この変換された式は、MVC メソッドの引数として互換性がある必要があります。

結合式

提案されたソリューションの核心は、関数を組み合わせるのと同じように、式を組み合わせることです。次のコードは結合メカニズムを示しています:

<code class="language-csharp">public static Expression<Func<TSource, TResult>> Compose<TSource, TIntermediate, TResult>(
    this Expression<Func<TSource, TIntermediate>> first,
    Expression<Func<TIntermediate, TResult>> second)
{
    return Expression.Lambda<Func<TSource, TResult>>(
        second.Body.Replace(second.Parameters[0], first.Body),
        first.Parameters[0]);
}</code>

このメソッドは、式インスタンスを次のコードに置き換えます:

<code class="language-csharp">public class ReplaceVisitor : ExpressionVisitor
{
    private readonly Expression from, to;
    public ReplaceVisitor(Expression from, Expression to)
    {
        this.from = from;
        this.to = to;
    }

    public override Expression Visit(Expression ex)
    {
        if (ex == from) return to;
        else return base.Visit(ex);
    }
}

public static Expression Replace(this Expression ex,
    Expression from,
    Expression to)
{
    return new ReplaceVisitor(from, to).Visit(ex);
}</code>

実践例

属性セレクターが指定された場合:

<code class="language-csharp">Expression<Func<object, string>> propertySelector = cust => cust.Name;</code>

とモデルセレクター:

<code class="language-csharp">Expression<Func<Model, Customer>> modelSelector = model => model.Customer;</code>

次のように組み合わせることもできます:

<code class="language-csharp">Expression<Func<Model, string>> magic = modelSelector.Compose(propertySelector);</code>

この手法を使用すると、式を変換してネストされたプロパティにアクセスし、MVC メソッドのパラメーターに適合させることができます。

以上がMVCパラメータのネストされたプロパティの式を変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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