式ツリーに取り組んでいるライブラリがあります。ライブラリは 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>>
ラムダとして指定できます。
Expression<Func<bool>> filter = () => (123.AsStringColumn() == "abc") && (...);
filter.Apply(document);
次に、私のコードは式ツリーを反復し、上記で指定したドキュメント フィルター メソッドを呼び出します。フィルターは、ラムダに入れることができるすべてのものをサポートしているわけではありません。メソッド呼び出しは最も明白なものです。
VB.Net は、C# が生成しない場合にメソッド呼び出しを生成するため、これらをインターセプトして別の方法で処理する必要があります。