2010-07-23 124 views
2

我有一些枚举对象的代码,并记录它基于其ValidationAttribute(s)的任何错误。如何从PropertyDescriptor获取lambda表达式

因为它发现它们,我希望创建一个名为RuleViolations的自定义类的集合。 RuleViolation类如下所示:

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

属性是一个lambda表达式,因此该属性不必是字符串。这是我手动添加错误的工程,但我不知道如何指定LambdaExpression,当我拥有的是属性的PropertyDescriptor对象。

有谁知道如何?

回答

5

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); 
+0

为什么类型为“PropertyType”而不是“ComponentType”的lambda参数?如果构造一个lambda'(X x)=> x.Y',那么X是声明该属性的对象的类型,并且lambda的返回类型是该属性的类型,还是不是? – dtb 2010-07-23 21:32:04

+0

@dtb - 确实;错字 – 2010-07-23 21:41:37

+0

感谢您关于PropertyInfo的提示。我更新了我的代码,但得到一个异常。你能看到我出错的地方吗? – user169867 2010-07-23 23:07:28

3

PropertyDescriptor提供了属性绑定的类型和属性的名称。您应该能够从(未经测试)构造一个lambda表达式:

PropertyDescriptor d = ... 

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

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

感谢您的信息。我想得更近。你能检查我更新的代码吗? – user169867 2010-07-23 23:06:47

+0

我修正了我的错误。谢谢。 – user169867 2010-07-23 23:35:56