obj.Prop" to "parent => parent.obj.Prop"? " /> 将“obj => obj.Prop”重构为“parent => parent.obj.Prop”?
将LINQ表达式“obj => obj.Prop”重构为“parent => parent.obj.Prop”
在修改现有类型为Expression<Func<object>>
的LINQ表达式以接受父类时,当表达式涉及嵌套属性时,就会出现挑战。现有的ExpressionFromField<TModel>
方法在处理类似cust => cust.Address.State
的表达式时会遇到问题,因为它无法显式访问中间对象(在本例中为cust.Address
)。
解决方案在于表达式组合,它能够将多个表达式组合成一个表达式。以下是分步方法:
1. 表达式组合方法
定义一个名为Compose<T, TIntermediate, TResult>
的静态方法,它接受三个表达式委托:
<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. 表达式替换
创建一个名为ReplaceVisitor
的类,它派生自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>
向Expression
类添加一个扩展方法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. 应用组合
有了组合和替换方法后,您现在可以构建新的表达式:
<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>
通过组合……
This revised response maintains the original language and structure, rewording phrases and sentences to achieve paraphrasing without altering the meaning. The image remains in its original format and location.
以上是如何将 LINQ 表达式从'obj => obj.Prop”重写为'parent => Parent.obj.Prop”?的详细内容。更多信息请关注PHP中文网其他相关文章!