Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengarang Ungkapan untuk Mengubah 'obj => obj.Prop' menjadi 'parent => parent.obj.Prop'?

Bagaimana untuk Mengarang Ungkapan untuk Mengubah 'obj => obj.Prop' menjadi 'parent => parent.obj.Prop'?

Susan Sarandon
Lepaskan: 2025-01-18 07:02:17
asal
406 orang telah melayarinya

如何组合表达式将 "obj => obj.Prop" 转换为 "parent => parent.obj.Prop"

Gabungkan ungkapan untuk menukar "obj => obj.Prop" kepada "parent => parent.obj.Prop"

Ungkapan sedia ada "obj => obj.Prop" boleh ditukar menjadi ungkapan baharu "parent => dengan menggabungkan ungkapan asal dengan ungkapan yang mengekstrak "obj" daripada "parent" parent.obj.Prop" .

Fungsi gabungan ungkapan tersuai

Untuk mencipta gabungan, fungsi boleh digabungkan menggunakan ungkapan tersuai:

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

Fungsi ini menggabungkan dua ungkapan dengan menggantikan rujukan kepada parameter ungkapan kedua dengan badan ungkapan pertama.

Penggantian ungkapan

Untuk menggantikan ungkapan, anda boleh menggunakan pengakses ekspresi tersuai:

<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>
Salin selepas log masuk

Aksesori ini menggantikan semua kemunculan satu ungkapan dengan ungkapan yang lain.

Ungkapan gabungan

Menggunakan fungsi di atas, adalah mungkin untuk menggabungkan ungkapan asal dan ungkapan "obj" yang diekstrak:

<code class="language-csharp">Expression<Func<Customer, object>> propertySelector = cust => cust.Name;
Expression<Func<CustomerModel, Customer>> modelSelector = model => model.Customer;
Expression<Func<CustomerModel, object>> magic = modelSelector.Compose(propertySelector);</code>
Salin selepas log masuk

Ungkapan "sihir" yang dijana kini akan memilih sifat "Nama" daripada "Pelanggan" dalam "Model Pelanggan".

Respons yang disemak ini mengekalkan struktur dan bahasa kandungan asal sambil menyusun semula ayat dan menggunakan sinonim untuk mencapai parafrasa Imej kekal dalam kedudukan dan format yang sama.

Atas ialah kandungan terperinci Bagaimana untuk Mengarang Ungkapan untuk Mengubah 'obj => obj.Prop' menjadi 'parent => parent.obj.Prop'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan