2012-04-19 2 views
0

모든 유형의 두 개체를 동적으로 비교할 수있는 제네릭 연산자 메서드를 만드는 중입니다. 예를 들면 다음과 같습니다.C# 번호 승격 식

Object a = (int)5; 
Object b = (long)7; 
return a < b; 

이제는 개체가 연산자보다 작음을 제공하지 않기 때문에 컴파일되지 않습니다. 개체를 각각의 유형으로 다시 캐스팅하면 분명히 작동합니다.

그러나 런타임에 유형을 알지 못합니다.

.NET 4 (사용할 수 없음)를 사용할 수 있으면 개체를 동적으로 캐스팅 할 수 있고 모두 괜찮을 것입니다. 그러나 내가 할 수 없기 때문에, 나는 표현식을 사용하는 codegen으로 남겨 졌거나 가능한 모든 타입과 값에 대해 캐스트를 제공한다고 믿는다!

그래서 표현!

표현식을 만들려면 객체를 올바른 유형 (쉽게)으로 언 박싱해야하지만 그 중 가장 큰 숫자 유형으로 피연산자 중 하나를 승격시켜야합니다. 프로모션 규칙은 C# 사양에 문서화되어 있습니다.

내 질문에 프레임 워크에 미리 작성된 프로모션 코드가 있습니까? 아니면 잘못된 길로 가고 있습니까?

도움 주셔서 감사합니다. 답변에 대한

업데이트

감사합니다. 나는 IComparable을 사용하려고 생각하지 않았다는 것을 인정해야한다. 왜냐하면 그 방법이 숫자 이상에 사용되기 때문이다. (분명히 말하지는 않았지만). 그런 말로하면 두 객체가 인터페이스를 구현하고 사용하는지 여부를 확인할 수 있습니다.

static bool IsLessThan<T, V>(T a, V b) where T : IComparable where V : IComparable 
{ 
    return a.CompareTo(b) < 0; 
} 

참고 값 :에서 IComparable, 당신은 두 개의 서로 다른 유형의

static bool IsLessThan<T>(T a, T b) where T : IComparable 
{ 
    return a.CompareTo(b) < 0; 
} 

객체 (값)에 방법을 비교 사용할 수 있습니다 T는 위치를 사용하는 경우

+0

iPhone을 사용하지 않을 때 코드 형식을 지정합니다. –

+3

당신은 iPhone에 모든 것을 썼습니까? 너보다 약한 손가락이있어. –

+0

고마워! 그것은 내 마음에했다. 오, 나를 위해 포맷 한 미니텍 덕분에! –

답변

3

, 제네릭을 사용하여 int 형, long 형 등등 - 이미 IComparable입니다. 얼마나 멋진가? :)

0

가장 좋은 방법은 제네릭을 아직 사용하지 않은 경우 IComparable을 구현하는 유형으로 제네릭 유형을 제한하고 그 다음 CompareTo 메서드를 사용하는 것이 가장 좋습니다.