Как получить лямбда-выражение из PropertyDescriptor - PullRequest
2 голосов
/ 24 июля 2010

У меня есть некоторый код, который перечисляет объект и записывает все ошибки, которые у него есть, на основе его атрибутов ValidationAttribute.

Когда он их находит, я хочу создать коллекцию пользовательского класса с именем RuleViolations. Класс RuleViolation выглядит следующим образом:

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

Свойство является лямбда-выражением, поэтому свойство не должно быть строкой. Это работает, когда я вручную добавляю ошибки, но я не уверен, как указать LambdaExpression, когда все, что у меня есть, это свойство PropertyDescriptor свойства.

Кто-нибудь знает как?

Ответы [ 2 ]

5 голосов
/ 24 июля 2010

Сайт LambdaExpression и PropertyDescriptor в основном в разных мирах (к моему большому разочарованию). LambdaExpression будет интересоваться PropertyInfo, а не PropertyDescriptor.

Если у вас есть 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);
3 голосов
/ 24 июля 2010

PropertyDescriptor предоставляет тип, к которому привязано свойство, и имя свойства.Вы должны иметь возможность построить лямбда-выражение из этого (не проверено):

PropertyDescriptor d = ...

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

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