[英]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.