给定一些表达式树inner
,我想将它包装在类型void
的无操作表达式中。仍应评估表达式inner
,但应丢弃其返回类型。我该怎么做?
如果您对我为什么要这样做感到好奇,那么这种转换的一个可能的应用是Expression.Switch
,这要求所有Expression.SwitchCase
表达式返回相同的类型。
我目前的解决方法是通过将Object
包裹起来,将所有内容投射到inner
,Expression.Block(inner, Expression.Constant(null))
。这样的解决方案看起来很奇怪,增加了我的代码,并且可能使生成的MSIL代码复杂化。
答案 0 :(得分:2)
一种选择是使用the overload of Expression.Switch()
that lets you specify the return type。如果指定void
,则将接受任何类型的表达式作为案例。在此重载中,您还需要指定defaultBody
和comparison
参数,但您可以将它们设为null
。
另一种选择确实是使用Expression.Block()
,但又是the overload that lets you specify the type。在你的情况下,这将是:
Expression.Block(typeof(void), inner)
我不希望这会对生成的IL产生任何重大影响。