문서를 읽은 후에 대답이 '아니오'라는 느낌이 들었습니다. 그러나, 나는 그것이 유형과 같은 관계 연산자, 지원하는지 알 수인지 알아 내기 위해 노력하고 있어요 : <를,>,> = 등 ... 내가 좋아하는 뭔가를 할 찾고관계 연산자를 지원하는 유형은 특정 인터페이스에서 파생됩니까?
:
Func<MyObject, object> greaterThan = obj => obj > 10;
var results = myList.Where(greaterThan).ToList();
을
다른 속성에서 검색 중이므로 십진수, 정수 또는 부동 소수점 수 있습니다. 나는 MVC 액션에서 이렇게하고있다. 내가 아는 한, 그것은 generics를 지원할 수 없다. 분명히 그것을 옮기고 일반적인 구현을 할 수는 있지만이 대답을 먼저 알고 싶습니다.
암시 적 연산자 오버로딩은 가능하지 않습니다. 그 이유는 런타임까지 속성이 알려지지 않았기 때문입니다 (미안합니다). 따라서 제네릭을 사용할 수도 없습니다.
Func<MyObject, IComparable> prop = obj => isOn ? obj.DecimalVal : obj.IntValue;
Func<MyObject, bool> clause = obj => prop(obj).CompareTo(0) != 0;
var results = myList.Where(clause);
난 그냥 compareTo와 반환 할 것을 희망하고있다 : 모든 속성을 감안할 때, 나는이 작동하는 것 같군 내 현재 구현의 다소 인위적인 예 (완전히 테스트되지 않음)은 0이 아니라고 확인해야 0; 심지어 소품이 int 0과 비교할 때 0의 값을 갖는 십진수를 평가하더라도 - 이들이 다른 유형 임에도 불구하고.
UPDATE는 내가 분명히 내 기대가 너무 높게 설정했다
, 위의 방법이 실패했습니다. 따라서 현재 사용하고있는 솔루션은 바람직하지 않지만 작동합니다. 나는보다 우아한 접근 방식을 듣고 싶다.
Func<MyObject, dynamic> prop = obj => isOn ? obj.DecimalVal : obj.IntValue;
Func<MyObject, bool> clause = obj => prop(obj) != 0;
var results = myList.Where(clause);
평등을 확인하기 위해'IComparable.CompareTo()'를 사용하면 안됩니다. 'IEquatable.Equals()'가 올바른 방법입니다. – svick
일반적인 구현이므로 IEquatable을 사용할 수 없습니다. 서명을'Func prop = ...'로 변경하고 .Equals를 대신 사용한다는 것을 제외하면 말입니다. –
nullable