将表达式树转换为void

时间:2014-03-11 13:43:35

标签: c# .net expression-trees

给定一些表达式树inner,我想将它包装在类型void的无操作表达式中。仍应评估表达式inner,但应丢弃其返回类型。我该怎么做?

如果您对我为什么要这样做感到好奇,那么这种转换的一个可能的应用是Expression.Switch,这要求所有Expression.SwitchCase表达式返回相同的类型。

我目前的解决方法是通过将Object包裹起来,将所有内容投射到innerExpression.Block(inner, Expression.Constant(null))。这样的解决方案看起来很奇怪,增加了我的代码,并且可能使生成的MSIL代码复杂化。

1 个答案:

答案 0 :(得分:2)

一种选择是使用the overload of Expression.Switch() that lets you specify the return type。如果指定void,则将接受任何类型的表达式作为案例。在此重载中,您还需要指定defaultBodycomparison参数,但您可以将它们设为null

另一种选择确实是使用Expression.Block(),但又是the overload that lets you specify the type。在你的情况下,这将是:

Expression.Block(typeof(void), inner)

我不希望这会对生成的IL产生任何重大影响。