c# - 如何从 PropertyDescriptor 获取 lambda 表达式

标签 c# asp.net-mvc data-annotations

我有一些代码可以枚举一个对象并根据它的 ValidationAttribute 记录它的任何错误。

当它找到它们时,我希望创建一个名为 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);

关于c# - 如何从 PropertyDescriptor 获取 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3322317/

相关文章:

c# - c#中类的泛型调用

c# - 计算多行的平均日期差异

c# - Stackexchange.Redis 超时和套接字故障

asp.net-mvc - Knockout-Kendo dropdownlist Ajax observableArray 获取选中项名称

c# - 在 C# 中从模型自动生成好友类

c# - 如何在 ViewModel 上使用数据注释?

c# - System.Windows.Controls.Canvas 到 System.Windows.Controls.TextBox 的无效转换异常

c# - MVC 中的 web api 不再工作

html - 如何使用 Html.BeginForm 打开新窗口

c# - 数据注释 vs Fluent API?支持各种 ORM 的最佳实践