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

根据对我的 使用 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;
}

但是,在运行代码时,我发现一些 lambdas 产生了预期的 成员表达式值,而另一些则产生了 UnaryExpression值。在使用 lambdas 添加所有属性之前,我必须将第一行代码更改为以下内容:

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

所有属性都是“简单”类型,例如在 POCO 业务对象中的 string、 DateTime、 int、 bool 等。它们由几个不同的 数据注释属性装饰。

是什么原因导致我的示例中的一些 lambdas 产生 成员表达式值和其他 UnaryExpression值?在我的示例中,第一个 UnaryExpression位于第三行,即 日期时间属性,但是布尔属性也会导致 UnaryExpressions

16096 次浏览

I think I know what the problem is. Your expression returns type object.

If you change this to Expression<Func<T, R>> the return type should be correctly inferred, and UnaryExpression (which I will assume is some boxing operation) should not occur.

Update:

The signature for Include should be:

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