obj.Prop"를 "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>
조합으로...
이 수정된 응답은 원래의 언어와 구조를 유지하고, 의미를 변경하지 않고 다른 말로 표현하기 위해 문구와 문장을 바꾸었습니다.
위 내용은 'obj => obj.Prop'에서 'parent => parent.obj.Prop'로 LINQ 식을 재작업하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!