표현식 트리에서 작동하는 라이브러리가 있습니다. 라이브러리는 식 트리가C#과 VB.Net 사이의 표현 트리 차이점
문자열 비교
() => "a" == "b"
을 구성하는 방법에 대한 언어 사이에 약간의 차이를 드러내 C# 및 VB.Net모두 작업해야하는
Expression.Equals("a", "b")
Function() "a" = "b"
이Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
을하게된다 VB.Net에서 CompareString을 사용하는 이유는 여기에 있습니다.Str ING의 연결
() => "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#이 인터셉트하고 다르게 처리해야하는 경우가 종종 있습니다.
캡쳐 된 변수, 익명 유형 및 불투명 식별자 ('let')는 아마도 약간의 사랑이 필요할 것입니다. –
@Marc 이름이 다를 수도 있지만 트리가 다르게 보이기를 기대합니까? – adrianm
VB.NET에서'option strict off'로 암시 적 변환을 찾으십시오. C#이 지원하지 않기 때문에 실제로는 차이가 없지만 처리에 관심이있을 수있는 추가 호출이있을 수 있습니다. –