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

时间:2010-08-25 15:57:26

标签: .net linq linq-expressions

根据我的Select a model property using a lambda and not a string property name问题的答案,想要按如下方式向集合中添加属性:

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 值。在使用lambdas添加所有属性之前,我必须将第一行代码更改为以下代码:

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

所有属性都是'简单'类型,即POCO业务对象中的字符串,DateTime,int,bool等。它们使用多种不同的 DataAnnotations 属性进行修饰。

是什么导致我的示例中的某些lambda产生 MemberExpression 值和其他 UnaryExpression 值?在我的示例中,第一行 UnaryExpression 位于第三行,即 DateTime 属性,但布尔属性也会导致 UnaryExpressions

1 个答案:

答案 0 :(得分:56)

我想我知道问题所在。表达式返回类型object

如果将此更改为Expression<Func<T, R>>,则应正确推断返回类型,并且UnaryExpression(我将假设是一些装箱操作)不应发生。

<强>更新

Include的签名应为:

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