表达式树成员将 null 与合并对象绑定?

Expression Tree Member binding null with coalesce object?

我正在尝试创建一个表达式树绑定,如果 属性 可用,它将创建一个对象,如果不可用,则放置 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'。我假设表达式树期望在合并中放置相同的类型 - 因为我有一些可以在上述情况下工作的可为 null 的枚举。

我试过有条件的

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

有什么办法可以让东西像这样工作吗?

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

您似乎没有提到 typeof for null constant as Expression.Constant(null,typeof(PersonModel)).

解释:

如果你检查 .Condition 的定义,它说当

时抛出 System.ArgumentException

test.Type is not System.Boolean.-or-ifTrue.Type is not equal to ifFalse.Type

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