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 중국어 웹사이트의 기타 관련 기사를 참조하세요!