MemberExpression : InvalidOperationExpression 변수 'x'가 범위 '에서 참조되었지만 정의되지 않았습니다.

c# expression-trees linq

문제

System.Linq.Expressions를 사용하고 있습니다.

MemberExpression 을 포함하는 간단한 LambdaExpression 을 만들려고했습니다. System.Linq.Expressions API (예 : MakeMemberAccess )로 명시 적으로 MemberExpression을 만들면 "InvalidOperationExpression 변수 'x'가 범위 ''에서 참조되지만 '정의되지 않았습니다.'라는 오류 메시지가 표시됩니다. LambdaExpression.

예를 들어, 이것은 내 코드입니다.

Expression<Func<Customer, string>> expression1, expression2, expression3;
Func<Customer, string> fn;
expression1 = (x) => x.Title;
fn = expression1.Compile();//works
fn(c);
MemberExpression m;
m = Expression.MakeMemberAccess(
Expression.Parameter(typeof(Customer), "x"), typeof(Customer).GetProperty("Title"));
expression2 = Expression.Lambda<Func<Customer, string>>(m,
    Expression.Parameter(typeof(Customer), "x"));

m = Expression.Property(Expression.Parameter(typeof(Customer),"x"), "Title");
expression3 = Expression.Lambda<Func<Customer, string>>(m,
    Expression.Parameter(typeof(Customer), "x"));

fn = expression3.Compile();//InvalidOperationExpression variable 'x' referenced from scope '', but it is not defined
fn = expression2.Compile();//InvalidOperationExpression variable 'x' referenced from scope '', but it is not defined

expression2 및 expression3은 Compile () 메서드가 호출되었지만 expression1은 호출되지 않을 때 예외를 throw합니다. expression1이 작동합니다. 왜 이런거야? 식 2, 3과 같은 MemberExpression을 만들고 Compile ()을 호출 할 때 예외를 throw하지 않도록하려면 어떻게합니까?

감사

수락 된 답변

당신은 "X"여러 번이라는 다른 매개 변수를 만들고 있습니다. 단일 ParameterExpression 을 사용하면 모든 것이 잘 동작합니다.

ParameterExpression p = Expression.Parameter(typeof(Customer), "x");
MemberExpression m = Expression.MakeMemberAccess(p, 
    typeof(Customer).GetProperty("Title"));
expression2 = Expression.Lambda<Func<Customer, string>>(m, p);

m = Expression.Property(p, "Title");
expression3 = Expression.Lambda<Func<Customer, string>>(m, p);

fn = expression3.Compile();
fn = expression2.Compile();

기본적으로 매개 변수 표현식은 이름과 일치하지 않습니다. 동일한 사물을 어디에서나 사용해야합니다. 조금은 고통 스럽지만 거기에 우리가 간다 ...




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.