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

10

我正在构建一个类型的属性列表,以便在该类型的集合导出中包含它们。我希望不使用字符串作为属性名称来完成这个任务。只有该类型的某些属性需要包含在列表中。我想要做的是:

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

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

2个回答

11
您可以通过检查传入的表达式来获取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 参数让我困惑了。 - ProfK

1
一个优秀的选择器配置应该像这样:
public void MethodConsumingSelector<TContainer, TSelected>(Expression<Func<TContainer, TSelected>> selector)
{
     var memberExpresion = expression.Body as MemberExpression;
     var propertyInfo = memberExpression.Member as PropertyInfo;
}

这可以防止您的选择器针对值类型时传递包含Convert(x => x.ValueTypeProperty)的UnaryExpression表达式。
请参见有关SO上UnaryExpression与MemberExpression的相关问题here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接