2010-07-23 3 views
2

개체에 대해 열거하고 ValidationAttribute를 기반으로하는 오류를 기록하는 코드가 있습니다.PropertyDescriptor에서 람다 식을 얻는 방법

나는 RuleViolations라는 사용자 정의 클래스의 컬렉션을 만들고 싶습니다. RuleViolation 클래스는 다음과 같습니다 : 속성이 문자열이어야하지 않도록

public string   Message { get; set; } 
public LambdaExpression Property { get; set; } 

재산권은 람다 식이다. 이것은 수동으로 오류를 추가 할 때 작동하지만 LambdaExpression을 지정하는 방법을 모르는 경우 PropertyDescriptor 객체가있을 때 작동합니다.

어떻게 알 수 있습니까?

답변

5

LambdaExpression와의 PropertyDescriptor 사이트 크게 다른 세계에서 (많은 내 초기 좌절에). LambdaExpression은 PropertyDefriptor가 아닌 PropertyInfo에 관심이 있습니다.

당신이 PropertyInfo이있는 경우, 당신은을 통해 표현 구성 할 수 있습니다 : 당신은 는 이름으로 해결을 시도 할 수 있습니다

PropertyInfo prop = ... 
ParameterExpression param = Expression.Parameter(prop.ReflectedType, "x"); 
LambdaExpression lambda = Expression.Lambda(
    Expression.Property(param, prop), param); 

, 그러나 이것은 당신이 사용하는 경우 특히, 반드시 동일한 하지입니다 맞춤형 모델 (ICustomTypeDescriptor 등) :

PropertyDescriptor prop = ... 
ParameterExpression param = Expression.Parameter(prop.ComponentType, "x"); 
LambdaExpression lambda = Expression.Lambda(
    Expression.Property(param, prop.Name), param); 
+0

람다 인수가'PropertyType'이 아닌'PropertyType' 유형입니까? 람다'(X x) => x.Y'를 구성하면 X는 속성이 선언 된 객체의 유형이고 람다의 반환 유형은 속성의 유형입니까, 아니면 아닙니다? – dtb

+0

@dtb - 실제로; typo –

+0

PropertyInfo에 대한 정보를 제공해 주셔서 감사합니다. 내 코드를 업데이트했지만 예외가 발생했습니다. 내가 잘못 된 곳을 볼 수 있니? – user169867

3

PropertyDescriptor는 속성이 바인딩 된 Type과 속성의 Name을 제공합니다. 당신은 그 (검증되지 않은)에서 람다 표현식을 구성 할 수 있어야한다 :

PropertyDescriptor d = ... 

Expression arg = Expression.Parameter(d.ComponentType, "arg"); 

LambdaExpression result = 
    Expression.Lambda(Expression.Property(arg, d.ComponentType, d.Name), arg); 
+0

감사합니다. 나는 더 가까이 생각한다. 내 업데이트 된 코드를 확인할 수 있습니까? – user169867

+0

실수를 수정했습니다. 고맙습니다. – user169867

관련 문제