c# - 表达式树成员绑定 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
。
反正有没有做这样的事情?
解决方案
您的陈述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的typeof。null
Expression.Constant(null,typeof(PersonModel))
解释:
如果你检查它的定义,.Condition
它说它会在什么System.ArgumentException
时候抛出
test.Type 不是 System.Boolean.-or-ifTrue.Type 不等于 ifFalse.Type
因此,在您的情况下,它正在检查和 表达式中的值的类型是否为。编译器能够为( new PersonModel() ) 得出相同的结论,但不能为( null ) 得出相同的结论,因此我们需要明确声明它。false
true
PersonModel
false
true
推荐阅读
- python - Pandas - 如何将多数组(3D)转换为可理解的数据框?
- python - Xpath Selenium-如何通过子文本定位元素
- node.js - MERN:由于 CORS 错误,无法将 React 连接到后端
- django - 是否可以在 Wagtail 中使用带有 RoutablePageMixin 的代理模型?
- wordpress - 在 wordpress 中,新产品不会出现 wpbakery 只有旧产品出现
- javascript - 查询以显示在 mongoose 聚合中公开的 json 响应
- vue.js - 如何在父组件中使用子组件?
- visual-studio-code - 在 VS Code 中禁用架构建议
- angular - switchMap 没有取消之前的 HTTP 调用
- javascript - 我如何获得过去的 cookie 同意页面