在MVC参数中生成嵌套属性表达式
目标是创建一个方法,将类似于“cust => cust.Name”的表达式转换为“parent => parent.obj.Name”,其中“parent”代表具有类型为“T”的字段的MVC模型。此转换后的表达式应作为MVC方法的参数兼容。
组合表达式
提出的解决方案的核心是组合表达式,类似于函数的组合方式。以下代码演示了组合机制:
<code class="language-csharp">public static Expression<Func<TSource, TResult>> Compose<TSource, TIntermediate, TResult>( this Expression<Func<TSource, TIntermediate>> first, Expression<Func<TIntermediate, TResult>> second) { return Expression.Lambda<Func<TSource, 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>
实际示例
给定一个属性选择器:
<code class="language-csharp">Expression<Func<object, string>> propertySelector = cust => cust.Name;</code>
和一个模型选择器:
<code class="language-csharp">Expression<Func<Model, Customer>> modelSelector = model => model.Customer;</code>
您可以按如下方式组合它们:
<code class="language-csharp">Expression<Func<Model, string>> magic = modelSelector.Compose(propertySelector);</code>
使用此技术,您可以转换表达式以访问嵌套属性,使其适合MVC方法参数。
以上是如何转换 MVC 参数中嵌套属性的表达式?的详细内容。更多信息请关注PHP中文网其他相关文章!