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'?
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!