使用 lambda 而不是字符串属性名称选择模型属性

Posted

技术标签:

【中文标题】使用 lambda 而不是字符串属性名称选择模型属性【英文标题】:Select a model property using a lambda and not a string property name 【发布时间】:2011-04-03 07:19:35 【问题描述】:

我正在构建一个类型的属性列表,以包含在该类型集合的导出中。我想在不使用字符串作为属性名称的情况下执行此操作。列表中仅包含该类型的某些属性。我想做类似的事情:

exportPropertyList<JobCard>.Add(jc => jc.CompletionDate, "Date of Completion");

如何实现这个通用的 Add 方法?顺便说一句,字符串是属性的描述。

【问题讨论】:

【参考方案1】:

您可以通过检查传入的表达式来获取 PropertyInfo 对象。类似于:

public void Add<T>(Expression<Func<T,object>> expression, string displayName)

    var memberExpression = expression.Body as MemberExpression;
    PropertyInfo prop = memberExpression.Member as PropertyInfo;
    // Add property here to some collection, etc ? 

这是一个不完整的实现,因为我不知道您究竟想对该属性做什么 - 但它确实显示了如何从表达式中获取 PropertyInfo - PropertyInfo 对象包含有关该属性的所有元数据。此外,请务必在将其应用于生产代码之前将错误处理添加到上述内容(即防止表达式不是 MemberExpression 等)。

【讨论】:

谢谢! Funcobject 参数让我很困惑。 没问题 - 如果答案解决了您的问题,请记住将答案标记为已接受 :-)【参考方案2】:

高级选择器配置如下所示:

public void MethodConsumingSelector<TContainer, TSelected>(Expression<Func<TContainer, TSelected>> selector)

     var memberExpresion = expression.Body as MemberExpression;
     var propertyInfo = memberExpression.Member as PropertyInfo;

当您的选择器以值类型为目标时,这可以防止传入的表达式成为包含 Convert(x =&gt; x.ValueTypeProperty) 的 UnaryExpression。

请参阅 SO here 上有关 UnaryExpression 与 MemberExpression 的相关问题。

【讨论】:

以上是关于使用 lambda 而不是字符串属性名称选择模型属性的主要内容,如果未能解决你的问题,请参考以下文章

从 lambda 表达式中获取属性名称*没有*对象实例

为啥不能使用符号而不是字符串来访问 Rails 模型属性?

代码优先Add-Migration仅选择对现有模型的更改而不是新模型

ASP.NET MVC 5 - LabelFor 显示属性名称而不是值,但 TextBoxFor 使用相同的属性可以正常工作

如何在数据库中存储选择选项的名称而不是值

以字符串形式获取 lambda 函数的名称