У меня есть библиотека, работающая над деревьями выражений. Библиотеке необходимо работать как с С#, так и с 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)
Моя библиотека обрабатывает все эти различия, но есть ли больше различий, которые мне нужно искать?
Edit Некоторое объяснение того, что делает мой код.
В системе, в которой я работаю, есть фильтр для документов, которые вы указываете следующим образом:
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);
Затем мой код выполняет итерацию дерева выражений и вызывает методы фильтра документа, как указано выше. Фильтр не поддерживает все, что можно положить в лямбду. Вызов метода является наиболее очевидным.
Так как VB.Net генерирует вызовы методов в некоторых случаях, когда С# мне не нужно перехватывать их и обрабатывать их по-разному.