我有一個處理表達式樹的庫。該庫需要與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#不需要攔截它們並以不同方式處理它們。
/
division運算符在C#和VB中的工作方式不同。在C#中它適應所使用的數據類型,而VB總是將操作數轉換為浮點值:
() => 1 / 2
成為Expression.Divide(1, 2)
Function() 1 / 2
變為Expression.Divide(Expression.Convert(1, Double), Expression.Convert(2, Double))
在VB中,您需要使用\
運算符進行整數除法,使用/
進行浮點除法以使其與C#中的/
運算符相同。