【发布时间】:2017-04-16 05:35:41
【问题描述】:
我正在尝试将自定义 MethodInfo 传递给 Expression.AndAlso 和 OrElse 工厂方法(分别用于 && 和 || 运算符)。这些运算符使用短路,这很困难,但通常使用& 和| 运算符(以及true 和false 运算符)。但是,Expression.AndAlso/OrElse 的 MSDN 文档没有提及 true 或 false 运算符。
为了测试,我声明了一个在两个整数上使用普通& 运算符的方法:
public static int And(int a, int b) {
return a & b;
}
请注意,返回类型必须是 int 而不是 bool 以避免异常。
然后我构造表达式:
var expr = Expression.AndAlso(
Expression.Constant(0),
Expression.Constant(5),
new Func<int, int, int>(And).Method
);
这会导致异常:
运算符“AndAlso”的用户定义运算符方法“And”必须具有关联的布尔 True 和 False 运算符。
奇怪的是,如果我使用具有 true 和 false 运算符的自定义结构,也会引发错误。如果结构重载& 运算符并且我传入该重载,我可以避免它,但如果我传入不同的方法则不会。不过,其他非短路运算符使用自定义方法。
问题是我不知道如何传递 true 和 false 运算符的方法。我首先认为我可以将它们组合为委托,但不同的方法具有不兼容的签名。有没有办法把这些方法传入?
大局
我正在构建一个用于解释表达式的系统,以支持提前编译。它支持对 AndAlso/OrElse 运算符使用自定义方法,目前通过采用自定义 Func<InterpretedExpression, InterpretedExpression, object> (当表达式被解释而不是编译时起作用)。如果它导致问题(这可能是由于它无法访问 true 和 false 方法),则可以轻松更改此设置。
注意:我正在使用 Visual Studio 的 C# Interactive 窗口进行测试,但最终需要支持 .NET 3.5(尽管有关较新版本的信息仍然有用且值得赞赏)。
【问题讨论】:
标签: c# .net linq expression-trees