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