> 백엔드 개발 > C++ > MVC 매개변수의 중첩 속성에 대한 표현식을 변환하는 방법은 무엇입니까?

MVC 매개변수의 중첩 속성에 대한 표현식을 변환하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-18 06:57:08
원래의
491명이 탐색했습니다.

How to Transform Expressions for Nested Properties in MVC Parameters?

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿