obj.Prop" kepada "parent => parent.obj.Prop"Ungkapan sedia ada "obj => obj.Prop" boleh..."/> obj.Prop" kepada "parent => parent.obj.Prop"Ungkapan sedia ada "obj => obj.Prop" boleh...">

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
Susan Sarandonasal
2025-01-18 07:02:17399semak imbas

如何组合表达式将 "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>

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>

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>

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!

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