obj.Prop" kepada "parent => parent.obj.Prop"Dalam usaha untuk mengubah suai jenis ungkapan Linq sedia ada..."/> obj.Prop" kepada "parent => parent.obj.Prop"Dalam usaha untuk mengubah suai jenis ungkapan Linq sedia ada...">
Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengolah Semula Ungkapan LINQ daripada 'obj => obj.Prop' kepada 'parent => parent.obj.Prop'?
obj.Prop" kepada "parent => parent.obj.Prop"? " /> Refactor "obj => obj.Prop" kepada "parent => parent.obj.Prop"?
Faktor semula ungkapan LINQ "obj => obj.Prop" menjadi "parent => parent.obj.Prop"
Apabila mengubah suai ungkapan LINQ jenis Expression<Func<object>>
sedia ada untuk menerima kelas induk, cabaran timbul apabila ungkapan itu melibatkan sifat bersarang. Kaedah ExpressionFromField<TModel>
sedia ada menghadapi masalah mengendalikan ungkapan seperti cust => cust.Address.State
kerana ia tidak boleh mengakses objek perantaraan secara eksplisit (cust.Address
dalam kes ini).
Penyelesaian terletak pada komposisi ekspresi, yang menggabungkan berbilang ungkapan menjadi satu. Berikut ialah kaedah langkah demi langkah:
1. Kaedah gabungan ungkapan
Tentukan kaedah statik bernama Compose<T, TIntermediate, TResult>
yang menerima tiga perwakilan ungkapan:
<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>
2. Penggantian ungkapan
Mencipta kelas bernama ReplaceVisitor
yang berasal daripada ExpressionVisitor
:
<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); } }</code>
Tambah kaedah sambungan Expression
pada kelas Replace
:
<code class="language-csharp">public static Expression Replace(this Expression ex, Expression from, Expression to) { return new ReplaceVisitor(from, to).Visit(ex); }</code>
3. Gabungan aplikasi
Dengan kaedah gabungan dan penggantian tersedia, anda kini boleh membina ungkapan baharu:
<code class="language-csharp">// 选择属性的表达式: Expression<Func<Customer, object>> propertySelector = cust => cust.Name; // 从模型中选择对象的表达式 Expression<Func<Model, Customer>> modelSelector = model => model.Customer; // 组合表达式 Expression<Func<Model, object>> magic = modelSelector.Compose(propertySelector);</code>
Dengan gabungan...
Respons yang disemak ini mengekalkan bahasa dan struktur asal, menyusun semula frasa dan ayat untuk mencapai parafrasa tanpa mengubah makna Imej kekal dalam format dan lokasi asalnya.
Atas ialah kandungan terperinci Bagaimana untuk Mengolah Semula Ungkapan LINQ daripada 'obj => obj.Prop' kepada 'parent => parent.obj.Prop'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!