J'ai une bibliothèque de travail sur l'expression des arbres. La bibliothèque besoin de travailler avec les deux C# et VB.Net
Remarqué quelques différences entre les langues sur la façon dont l'expression arbres sont construits
Comparaison de chaînes de caractères
() => "a" == "b"
devientExpression.Equals("a", "b")
Function() "a" = "b"
devientExpression.Equals(Expression.Call(CompareString, "a", "b"), 0)
(Je comprends pourquoi VB.Net utilise CompareString ici)La concaténation de chaîne
() => "a" + "b"
devientExpression.Add("a", "b", String.Concat)
Function() "a" & "b"
devientExpression.Call(String.Concat, "a", "b")
Optimisation?
() => !(1 == 2)
devientExpression.Not(Expression.Equals(1, 2))
Function() Not (1 = 2)
devientExpression.NotEqual(1, 2)
Ma bibliothèque de répondre à toutes ces différences, mais il y a plus de différences que j'ai besoin pour regarder dehors pour?
Modifier Une explication de ce que mon code ne.
Le système que je travail avec un filtre pour les documents que vous spécifiez comme ceci:
var filter = document.Filter;
filter.LeftParanthesis();
filter.Column(columnNumber);
filter.Equals();
filter.Value("abc");
filter.RightParanthesis();
filter.And();
filter.LeftParanthesis();
...
document.Refresh();
Pour le rendre plus facile à utiliser le filtre de mon code vous permet de spécifier le filtre en tant que Expression<Func<bool>>
lambda.
Expression<Func<bool>> filter = () => (123.AsStringColumn() == "abc") && (...);
filter.Apply(document);
Mon code puis parcourt l'arborescence d'expression et appelle le document les méthodes de filtrage comme indiqué ci-dessus. Le filtre n'ont pas de soutien pour tout ce que vous pouvez mettre dans une lambda. Les appels de méthode est la plus évidente.
Depuis VB.Net génère des appels de méthode, dans certains cas, où C# n'ai-je pas besoin de les intercepter et de les gérer différemment.