2011-09-08 2 views
1

문서를 읽은 후에 대답이 '아니오'라는 느낌이 들었습니다. 그러나, 나는 그것이 유형과 같은 관계 연산자, 지원하는지 알 수인지 알아 내기 위해 노력하고 있어요 : <를,>,> = 등 ... 내가 좋아하는 뭔가를 할 찾고관계 연산자를 지원하는 유형은 특정 인터페이스에서 파생됩니까?

:

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); 
+0

평등을 확인하기 위해'IComparable.CompareTo()'를 사용하면 안됩니다. 'IEquatable.Equals()'가 올바른 방법입니다. – svick

+0

일반적인 구현이므로 IEquatable을 사용할 수 없습니다. 서명을'Func prop = ...'로 변경하고 .Equals를 대신 사용한다는 것을 제외하면 말입니다. – nullable

답변

3

아니요. C#에서 연산자는 형식의 정적 멤버이므로 인터페이스의 일부가 될 수 없습니다. dynamic :

Func<dynamic, bool> greaterThan = obj => obj > 10; 
var results = myList.Cast<dynamic>().Where(greaterThan).ToList(); 

myListint의, double의 또는 decimal s의 모음입니다 여부를 작동

는 C# 4 당신의 코드에서 작동하는 하나 개의 방법이있다.

을 (. 그러나 results 유형 List<dynamic>이다 조심)하지만 닷넷 actally 연산자 흔히 사용되는 것과 동일한 목적으로 이용 될 수있는 인터페이스를 제공 항등 (IEquatable<T>)에 대해 비교하고, 비교되는 요소가 크고이다 더 작습니다 (IComparable<T>). 그것들을 사용하면 다음과 같은 코드를 작성할 수 있습니다 :

static IEnumerable<T> GreaterThan<T>(this IEnumerable<T> collection, T item) 
    where T : IComparable<T> 
{ 
    return collection.Where(x => x.CompareTo(item) > 0); 
} 
+0

동적 인 +1은 내 마음을 가로 지르지 않았습니다. 운영자가 정회원이라는 사실도 마찬가지입니다! – nullable

+0

+1 동적 및 자세한 내용은 사용법에 대한 자세한 내용은 및 IComparable Sumo

2

무엇 IComparable<T>IEqutable<T> 인터페이스를 사용하는 방법에 대한. 객체 간의 일반적인 비교를 수행하도록 설계되었습니다.

1

여기서 implicit operator overloading을 사용할 수 있습니다. 또한 평등을 구현하기 위해 IEquatable을 사용하고 정렬을 비교하기 위해 IComparable을 사용하는 것에 대한 @ gmamaladze의 대답도 고려할 것입니다.

+0

변환 연산자를 사용하여 어떻게 도움을 얻을 수 있는지 명확히 설명해 주시겠습니까? – svick

0

아니요. < > >= <=과 같은 연산자를 지원하려면 클래스에 연산자를 명시 적으로 정의해야합니다. Operator overloading.

클래스에 implicit casts을 정의 할 수도 있습니다.이렇게하면 대상 유형에 암시 적으로 개체를 캐스팅 한 다음 수학 연산을 수행 할 수 있습니다. This article가 도움이 될 것 같습니다.

관련 문제