我想要在自定义MethodInfo
到Expression.AndAlso
和OrElse
工厂方法(这是用于&&
和||
运营商,分别)通过。这些运营商使用短路,这使得这很困难,但通常使用&
和|
运营商(以及true
和false
运营商)。但是,Expression.AndAlso/OrElse
的MSDN文档没有提及真假操作符。构建AndAlso/OrElse运算LINQ表达与自定义的方法
为了测试,我已经宣布对两个整数使用普通&
操作的方法:
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”必须具有相关联的布尔真和假的运营商。
奇怪的是,如果我使用具有true
和false
运营商定制的结构中的错误也被抛出。我可以避免它,如果结构重载&
运算符,我传入该重载,但不是如果我传入一个不同的方法。尽管如此,其他非短路操作符仍然可以使用自定义方法。
问题是我不知道如何传递true
和false
运算符的方法。我首先想到我可以将它们组合为委托,但不同的方法具有不兼容的签名。有什么办法可以传入这些方法吗?
的大局观
我建立一个系统,用于解释表达式支持名列前茅的时间编译。它支持使用AndAlso/OrElse运算符的自定义方法,目前通过自定义Func<InterpretedExpression, InterpretedExpression, object>
(其工作原因是表达式被解释而不是编译)。如果它导致问题很容易被改变(这可能是由于它没有可访问的方法true
和false
)。
注:我使用Visual Studio的C#互动窗口进行测试,但最终需要支持.NET 3.5(尽管较新版本的信息仍然是有益的和赞赏)。