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

然而,在运行代码时,我发现一些 lambdas 产生了 MemberExpression 值如预期,但其他人产生了 UnaryExpression 值 0x251819142121在使用 lambda 添加所有属性之前,我必须将第一行代码更改为以下内容:
var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;

所有属性都是“简单”类型,即 POCO 业务对象中的 string、DateTime、int、bool 等。它们装饰有几个不同的 DataAnnotations 属性。

是什么导致我的示例中的某些 lambda 表达式产生 MemberExpression 值和其他 UnaryExpression 值?在我的例子中,第一个 UnaryExpression 位于第三行, DateTime 属性,但 9015121411414214214142142142142个 bool 属性也导致

最佳答案

我想我知道问题是什么。您的表达式返回类型 object

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

更新:
Include 的签名应该是:

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

关于.net - 为什么有些对象属性是 UnaryExpression 而有些是 MemberExpression?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3567857/

10-13 07:58
查看更多