2010-06-29 4 views
1

모든 클래스는 IPrettyPrint 인터페이스를 구현합니다. 확장 메서드를 사용하면 예를 들어 Double에 PrettyPrint 메서드를 추가 할 수 있습니다. (List<T>, ...)하지만 IPrettyPrint를 이중으로 지원할 수있는 가능성이 있습니까? PrettyPrint 메서드를 사용하기를 좋아하는 사람은 IPrettyPrint에만 의존 할 수 있습니다.확장 메서드 및 인터페이스

답변

3

아니요, "오리 입력"을 허용하는 라이브러리를 사용하지 않는 한 아니요. 그리고 심지어 그 방법이 확장 메서드에서만 구현 되었다면 당신이 어려울 것이라고 생각합니다.

확장 메서드에 속지 마십시오. 형식 자체에 아무 것도 추가하지 않고 컴파일러에서 해석하는 "구문 설탕"만 제공합니다.

1

확장 메서드는 런타임 기능이 아닌 컴파일러 기능으로, Type에 메서드를 추가하는 것을 에뮬레이트합니다. 그러나 코드를 디 컴파일하면 실제로는 그렇게하지 않습니다 (.NET에서는 정적/폐쇄 형 시스템, 실제로 유형에 메서드를 추가 할 수있는 유일한 방법은 형식에서 상속

그래서, 기술적, double 결코 IPrettyPrint를 지원하지 않습니다) 당신의 새로운 유형으로 방법을 추가하는 것입니다 그래서 - 컴파일러는 단지 그것이하는 것처럼 가장합니다.

0

타입이 조작을 지원하면 (즉, 찾고있는 메소드가 정의 된 경우) 반사 형을 사용하여 오리 유형을 에뮬레이션 할 수 있습니다. 그런 다음 암시 적으로 해당 인터페이스를 사용합니다. 전화해야합니다. 그렇지 않으면, 그렇지 않습니다!

문제는 C# 반사가 약간 느리고 대부분의 경우 시간을 낭비하는 것입니다. 예제 코드는 다음과 같습니다.

통계가 마음에 드는 사람이라면 반영이 필요할 때 아무 것도 없습니다. 그러나 메서드 호출 :

obj = method.Invoke(null, new object[]{value}); 

성능 호그는 실행하는 데 약 4-5 밀리 초가 걸립니다.