MemberExpression
이 객체 인스턴스에 속하는지 또는 표현식의 매개 변수인지 여부를 확인하려고합니다. 실행 가능한 솔루션이라고 생각하는 것을 생각해 냈습니다.하지만 SE에서 먼저 실행하고 싶습니다. 우선이 두 식을 가지고 :MemberExpression이 인스턴스에 속하는지 여부 확인
var myClassInstance = new MyClass();
Expression<Func<MyClass, bool>> exp1 = mc => myClassInstance.MyBool;
Expression<Func<MyClass, bool>> exp2 = mc => mc.MyBool;
exp1
는 지역 변수/필드에 대한 참조를 포함합니다.
Expression.Lambda<Func<object>>(Expression.Convert(exp1.Body as MemberExpression, typeof(object))).Compile();
exp2
에서 .MyBool
개체 참조에서 아니지만, paremeter : 더 아래로 내 코드에서, .MyBool
는 다음과 같이 그 값을 검색하기 위해 컴파일됩니다. .MyBool
표현식을 컴파일하려고하면 variable 'mc' of type 'ConsoleLol.MyClass' referenced from scope '', but it is not defined
예외가 발생합니다.
var exp1parent = (exp1.Body as MemberExpression).Expression;
var exp2parent = (exp2.Body as MemberExpression).Expression;
Console.WriteLine(exp1parent.NodeType);
Console.WriteLine(exp2parent.NodeType);
표현의 부모 표현이 인스턴스가 아닌 경우에는 NodeType
속성이 Parameter
될 것입니다 것으로 보인다. 그렇지 않은 경우, 다른 경우 (이 경우 MemberAccess
)가됩니다.
이 결론에서 정확합니까? 아니면이 검사를 수행하는보다 이상적인 방법이 있습니까?
실제로 무엇을하려고하는지 설명해 주시겠습니까? 'Expression>'이라는 표현식은'MyClass'를 전달하지 않는 것처럼 보이는 이유는 무엇입니까? 이 모든 것을 피할 수있는'Expression '을 사용하지 않으시겠습니까? –
svick
@svick 무슨 뜻인지 확실하지 않습니다. 'Func'은 매개 변수로'MyClass'를 받아 들여'bool'을 반환하도록 정의됩니다. 게다가,이 함수를 사용하여 표현식을 SQL로 변환하기 때문에 MyClass가 필요하다.표현식이 인스턴스 멤버에 속하는지 여부를 알아야만 값을 얻기 위해 컴파일할지 또는 사용자 정의 SQL 함수로 표현식을 변환할지 결정할 수 있습니다. 제한된 공간으로 모든 것을 자세하게 설명하기가 어렵습니다. –
oscilatingcretin