..."/> ...">

Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengubah Ungkapan untuk Sifat Bersarang dalam Parameter MVC?

Bagaimana untuk Mengubah Ungkapan untuk Sifat Bersarang dalam Parameter MVC?

Barbara Streisand
Barbara Streisandasal
2025-01-18 06:57:08491semak imbas

How to Transform Expressions for Nested Properties in MVC Parameters?

Jana ungkapan atribut bersarang dalam parameter MVC

Matlamatnya ialah untuk mencipta kaedah yang menukar ungkapan seperti "cust => cust.Name" kepada "parent => parent.obj.Name", dengan "parent" mewakili anak dengan model MVC jenis "T" untuk padang. Ungkapan yang ditukar ini harus serasi sebagai hujah kepada kaedah MVC.

Ungkapan gabungan

Inti penyelesaian yang dicadangkan adalah untuk menggabungkan ungkapan, sama seperti cara fungsi digabungkan. Kod berikut menunjukkan mekanisme penggabungan:

<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>

Kaedah ini menggantikan contoh ungkapan dengan kod berikut:

<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>

Contoh praktikal

Diberikan pemilih atribut:

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

dan pemilih model:

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

Anda boleh menggabungkannya seperti berikut:

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

Menggunakan teknik ini, anda boleh mengubah ekspresi untuk mengakses sifat bersarang supaya ia sesuai dengan parameter kaedah MVC.

Atas ialah kandungan terperinci Bagaimana untuk Mengubah Ungkapan untuk Sifat Bersarang dalam Parameter MVC?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn