我有一个处理表达式树的库。该库需要同时使用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#不会生成方法调用,因此我需要截获这些调用,并对它们进行不同的处理。
https://stackoverflow.com/questions/16103529
复制相似问题