簡體   English   中英

如何從 PropertyDescriptor 獲取 lambda 表達式

[英]How to get a lambda expression from a PropertyDescriptor

我有一些代碼可以枚舉對象並根據其 ValidationAttribute(s) 記錄它的任何錯誤。

當它找到它們時,我希望創建一個名為 RuleViolations 的自定義類的集合。 RuleViolation 類如下所示:

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

屬性是一個 lambda 表達式,因此屬性不必是字符串。 這在我手動添加錯誤時有效,但當我只有屬性的 PropertyDescriptor 對象時,我不確定如何指定 LambdaExpression。

有誰知道怎么做?

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

PropertyDescriptor 提供屬性綁定到的類型和屬性的名稱。 您應該能夠從中構造一個 lambda 表達式(未經測試):

PropertyDescriptor d = ...

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

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

PropertyDescriptor更像是一個“虛擬”屬性。 它可能根本沒有支持字段,因此除了微不足道的情況外,所有以前的解決方案都將失敗。

但是,屬性描述符提供對 get(和可選的 set)方法的訪問。 因此,PropertyDescriptor讀取訪問完全等效的MethodCallExpression

static readonly MethodInfo PropertyDescriptorGetter =
   typeof(PropertyDescriptor).GetMethod(nameof(PropertyDescriptor.GetValue));

PropertyDescriptor prop = ...;
ParameterExpression param = Expression.Parameter(prop.ComponentType, "x");
MethodCallExpression value = Expression.Call(prop, PropertyDescriptorGetter, param);
LambdaExpression lambda = Expression.Lambda(value, param);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM