根据我在选择使用lambda而不是字符串属性名来选择模型属性问题的回答,想要将属性添加到集合中,如下所示:
var props = new ExportPropertyInfoCollection<JobCard>();
props.Include(model => model.BusinessInstallNumber).Title("Install No").Width(64).KeepZeroPadding(true);
props.Include(model => model.DeviceName).Title("Device").Width(70);
props.Include(model => model.DateRequested).Title("Request Date").Format("{0:dd/MM/yyyy}").Width(83);
我在Include
方法中编写了以下代码:
public class PropertyCollection<T>
{
public void Include(Expression<Func<T, object>> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression != null)
{
var pes = new ExportPropertyInfoBuilder {Property = new ExportPropertyInfo {Property = memberExpression.Member as PropertyInfo}};
Properties.Add(pes.Property.Property.Name, pes.Property);
return pes;
}
然而,在运行代码时,我发现一些lambda表达式按预期产生了MemberExpression值,但其他的却产生了UnaryExpression值。在添加所有属性之前,我必须将第一行代码更改为以下内容:
var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;
所有的属性都是“简单”类型,即在POCO业务对象中为字符串、DateTime、整数、布尔等。它们带有几个不同的DataAnnotations属性。
导致我的示例中的一些lambda产生MemberExpression值,而其他的则产生UnaryExpression值是什么原因?在我的示例中,第一个UnaryExpression位于第三行的DateTime属性上,但布尔属性也会产生UnaryExpressions。
Include
期望的表达式类型(包括约束条件)? - leppie