表达式树成员将 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
因此,在您的情况下,它正在检查 false
和 true
表达式中值的 Type 是否为 PersonModel
。
编译器能够为 false
(new PersonModel()) 得出相同的结论,但不能为 true
(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'
。我假设表达式树期望在合并中放置相同的类型 - 因为我有一些可以在上述情况下工作的可为 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
因此,在您的情况下,它正在检查 false
和 true
表达式中值的 Type 是否为 PersonModel
。
编译器能够为 false
(new PersonModel()) 得出相同的结论,但不能为 true
(null) 得出相同的结论,所以我们需要明确说明。