如何从PropertyDescriptor获取lambda表达式

use*_*867 2 c# asp.net-mvc data-annotations

我有一些代码枚举一个对象,并根据其ValidationAttribute记录它所有的错误.

当它找到它们时,我希望创建一个名为RuleViolations的自定义类的集合.RuleViolation类如下所示:

public string           Message  { get; set; }
public LambdaExpression Property { get; set; }
Run Code Online (Sandbox Code Playgroud)

属性是lambda表达式,因此该属性不必是字符串.当我手动添加错误但是我不确定如何指定LambdaExpression时,我所拥有的是属性的PropertyDescriptor对象.

有谁知道怎么样?

Mar*_*ell 5

LambdaExpression和PropertyDescriptor网站主要在不同的世界(很多我最初的沮丧).LambdaExpression将对PropertyInfo感兴趣,而不是PropertyDescriptor.

如果您有PropertyInfo,则可以通过以下方式构造Expression:

PropertyInfo prop = ...
ParameterExpression param = Expression.Parameter(prop.ReflectedType, "x");
LambdaExpression lambda = Expression.Lambda(
    Expression.Property(param, prop), param);
Run Code Online (Sandbox Code Playgroud)

可以还尝试通过名称来解决,但这并不一定是相同的,特别是如果你使用的是自定义类型模型(ICustomTypeDescriptor等):

PropertyDescriptor prop = ...
ParameterExpression param = Expression.Parameter(prop.ComponentType, "x");
LambdaExpression lambda = Expression.Lambda(
    Expression.Property(param, prop.Name), param);
Run Code Online (Sandbox Code Playgroud)