为什么有些对象属性是 UnaryExpression,而另一些对象属性是 MemberExpression?

2024-04-20

根据我的答案采取行动使用 lambda 而不是字符串属性名称选择模型属性 https://stackoverflow.com/questions/3558974/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 method:

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 产生了会员表达值符合预期,但其他值产生了一元表达式价值观。我必须将第一行代码更改为以下内容,然后才能使用 lambda 添加所有属性:

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

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

是什么导致我的示例中的某些 lambda 产生结果会员表达价值观和其他一元表达式价值观?在我的例子中,第一个一元表达式在第三行,DateTime属性,但布尔属性也会导致一元表达式.


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

如果你将其更改为Expression<Func<T, R>>应该正确推断返回类型,并且UnaryExpression(我假设这是一些拳击操作)不应该发生。

Update:

签名为Include应该:

public void Include<T, R>(Expression<Func<T, R>> expression)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么有些对象属性是 UnaryExpression,而另一些对象属性是 MemberExpression? 的相关文章

随机推荐