我有一个关于表达式树的库,需要同时与C#和VB.Net一起使用。
注意到语言之间如何构建表达式树存在一些差异:
字符串比较
() => "a" == "b"
变成Expression.Equals("a", "b")
Function() "a" = "b"
变成Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
(我理解为什么 VB.Net 在这里使用 CompareString)字符串拼接
() => "a" + "b"
变成Expression.Add("a", "b", String.Concat)
Function() "a" & "b"
变成Expression.Call(String.Concat, "a", "b")
优化?
() => !(1 == 2)
变成Expression.Not(Expression.Equals(1, 2))
Function() Not (1 = 2)
变成Expression.NotEqual(1, 2)
我的库已经处理了所有这些差异,但是还有其他我需要注意的差异吗?
编辑 我的代码做了一些解释。
我所使用的系统有一个文档过滤器,您可以像这样指定:
var filter = document.Filter;
filter.LeftParanthesis();
filter.Column(columnNumber);
filter.Equals();
filter.Value("abc");
filter.RightParanthesis();
filter.And();
filter.LeftParanthesis();
...
document.Refresh();
为了更方便使用过滤器,我的代码允许您将过滤器指定为
Expression<Func<bool>>
lambda表达式。Expression<Func<bool>> filter = () => (123.AsStringColumn() == "abc") && (...);
filter.Apply(document);
我的代码会迭代表达式树并按照上述规定调用文档过滤方法。该过滤器不支持 lambda 中的所有内容,其中最明显的是方法调用。
由于 VB.Net 在某些情况下生成方法调用而 C# 不生成,因此我需要拦截这些并以不同的方式处理它们。
Option Strict
可能会发生隐式转换。虽然C#不支持此功能,但它可能会引入一些额外的调用,您可能有兴趣处理。 - Julien Lebosquain