为什么有一些对象属性UnaryExpression和其他MemberExpression?

对我的答案select使用lambda而不是string属性名称问题的模型属性 ,想要将属性添加到集合,如下所示:

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; } 

但是,在运行代码时,我发现一些lambdas按照预期产生了MemberExpression值,但是其他人产生了UnaryExpression值。 在使用lambdas添加所有属性之前,必须将第一行代码更改为以下代码:

 var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression; 

所有属性都是“简单”types,即string,date时间,整型,布尔等在POCO业务对象中。 他们装饰有几个不同的DataAnnotations属性。

什么导致我的例子中的一些lambdaexpression式产生MemberExpression值和其他UnaryExpression值? 在我的例子中,第一个UnaryExpression是第三行, DateTime属性,但布尔属性也导致UnaryExpressions

我想我知道问题是什么。 你的expression式返回typesobject

如果将此更改为Expression<Func<T, R>> ,则应正确推断返回types,并且不应出现UnaryExpression (我将假定这是一些装箱操作)。

更新:

Include的签名应该是:

 public void Include<T, R>(Expression<Func<T, R>> expression)