首页 > 解决方案 > 表达式树成员绑定 null 与合并对象?

问题描述

我正在尝试创建一个表达式树绑定,如果属性可用,它将创建一个对象,如果不是,则放置 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#.netentity-frameworklinqexpression

解决方案


您的陈述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))));

看起来你错过了提到的是常量as的typeofnullExpression.Constant(null,typeof(PersonModel))

解释:

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

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

因此,在您的情况下,它正在检查和 表达式中的值的类型是否为。编译器能够为( new PersonModel() ) 得出相同的结论,但不能为( null ) 得出相同的结论,因此我们需要明确声明它。falsetruePersonModelfalsetrue


推荐阅读