【问题标题】:Expression Tree Member binding null with coalesce object?表达式树成员绑定 null 与合并对象?
【发布时间】:2021-02-19 18:13:34
【问题描述】:

我正在尝试创建一个表达式树绑定,如果属性可用,它将创建一个对象,如果不可用,则放置 null。例如,我想最终得到:

personModel = car.Person == null ? null : new PersonModel() 

但无论我尝试什么都失败了。

我试过合并

Expression.Coalesce(
  Expression.Property(param, "Person"),
  Expression.MemberInit(Expression.New(typeof(PersonModel)), MemberAssignment[])
)

这会抛出System.ArgumentException: 'Argument types do not match'。我假设表达式树期望在合并中放置相同的类型 - 因为我有一些可以在上述场景中工作的可空枚举。

我尝试了条件

Expression.Condition(
  Expression.Equal(Expression.Property(param, "Person"), Expression.Constant(null)),
  Expression.MemberInit(Expression.New(typeof(PersonModel)), MemberAssignment[]),
  Expression.Constant(null)
)

这也会抛出System.ArgumentException: 'Argument types do not match',因为真正的块有Expresison.MemberInit,而错误的块有Expression.Constant

有没有办法让 像这样工作?

【问题讨论】:

    标签: c# .net entity-framework linq expression


    【解决方案1】:

    您的声明personModel = car.Person == null ? null : new PersonModel() 可以翻译为:

     Expression.Condition(
     Expression.Equal(Expression.Property(Expression.Constant(car), "Person"), Expression.Constant(null,typeof(PersonModel))),
     Expression.Constant(null, typeof(PersonModel)), Expression.MemberInit(Expression.New(typeof(PersonModel))));
    

    您似乎错过了提及 nulltypeof 常量为 Expression.Constant(null,typeof(PersonModel))

    说明:

    如果您检查 .Condition 的定义,它会说它会在什么时候抛出 System.ArgumentException

    test.Type 不是 System.Boolean.-or-ifTrue.Type 不等于 ifFalse.类型

    因此,在您的情况下,它正在检查 falsetrue 表达式中值的 Type 是否为 PersonModel。 编译器能够对 false (new PersonModel()) 得出相同的结论,但对于 true (null) 则不行,因此我们需要明确说明。

    【讨论】:

    • 啊!谢谢@gkulshrestha!关于为什么我们需要指定 null 类型的任何信息?
    • @GrizzlyEnglish 我在回答中添加了更多细节。希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多