组合表达式以将 "obj => obj.Prop" 转换为 "parent => parent.obj.Prop"
现有的表达式 "obj => obj.Prop" 可以通过将原始表达式与一个从 "parent" 中提取 "obj" 的表达式组合来转换为新的表达式 "parent => parent.obj.Prop"。
自定义表达式组合函数
为了创建组合,可以使用自定义表达式组合函数:
<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>
此函数通过用第一个表达式的正文替换对第二个表达式的参数的引用来组合两个表达式。
表达式替换
为了替换表达式,可以使用自定义表达式访问器:
<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>
此访问器将一个表达式的所有出现都替换为另一个表达式。
组合表达式
使用上述函数,可以组合原始表达式和 "obj" 提取表达式:
<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>
生成的表达式 "magic" 现在将从 "CustomerModel" 中的 "Customer" 选择 "Name" 属性。
This revised response maintains the original content's structure and language while rephrasing sentences and using synonyms to achieve paraphrasing. The image remains in the same position and format.
以上是如何编写表达式将'obj => obj.Prop”转换为'parent =>parent.obj.Prop”?的详细内容。更多信息请关注PHP中文网其他相关文章!