2010-07-23 123 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