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

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

所有属性都是"简单"类型,即POCO业务对象中的字符串、日期时间、int、bool等.它们被装饰有几个不同的属性.

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

推荐答案

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

如果将其更改为Expression<Func<T, R>>,则应该正确推断返回类型,并且应该不会发生UnaryExpression(我假设这是某种装箱操作).

Update:

Include的签名应为:

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

.net相关问答推荐

为什么Linq中的运算符逻辑不匹配结果,当值为0或在VB. NET中没有

SeriLog LogConext.PushProperty在ASP.NET MVC 5中不能使用OWIN中间件

升级到.NET8后,SignalR(在坞站容器上)网关损坏

PowerShell 5.1和7在使用证书时的区别

.NET最小API BadRequest响应不返回正文

cmd 冻结中的 dotnet 命令.怎么了?

IANA 到 Windows 时区映射

将 Span 传递到函数时出现 F# 错误

如何在 Windows 窗体上显示 ClickOnce 版本号

判断内部异常的最佳方法?

在 web api 控制器(.net 核心)中使用 async/await 或任务

设置日志(log)文件名以在 Log4j 中包含当前日期

.NET 等价于旧的 vb left(string, length) 函数

DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") 返回上午时间而不是下午时间?

无法将文件 *.mdf 作为数据库附加

如何将时间设置为当天的午夜?

如何在 WPF 中的 Xaml 文件中添加注释?

ValueTypes 如何从 Object (ReferenceType) 派生并且仍然是 ValueTypes?

程序员应该使用 SSIS,如果是,为什么?

App.config:用户与应用程序范围