2013-07-17 12 views
3

변수 클래스가 확장 클래스이기도 한 제네릭 클래스 내에서 확장을 호출하는 방법이 있습니까? 다음은 샘플 코드입니다. 컴파일되지 않습니다. 하지만,제네릭 클래스 내부에서 확장 메서드를 호출 할 수 있습니까?

public class GenericFoo<TFrom, TTo> 
    where TFrom : MyExtendedType 
    where TTo : MyType 
{ 
    public TTo SomeMethod(TFrom A) 
    { 
     return (TTo)A.Bar(); 
    } 
} 

이 그것을 컴파일에 도착하기에 충분합니다

'TFrom' does not contain a definition for 'Bar' and the best extension method overload 'MyNamespace.Extensions.Bar(MyNamespace.MyExtendedType)' has some invalid arguments

답변

2

당신은 당신이 제네릭 형식 제약를 추가 할 수 있습니다 :

public class GenericFoo<TFrom,TTo> 
{ 
    public TTo GenericFoo(TFrom A) 
    { 
     return A.Bar(); 
    } 
} 

public static class Extensions 
{ 
    public static MyType Bar(this MyExtendedType source) 
    { 
     return new MyType(); 
    } 
} 

이 다음과 같은 오류가 발생합니다 MyType에서 TTo까지 캐스트가없는 경우에도 런타임 오류가 발생합니다.

더 읽을

+0

좋아, 패배의 종류 첫번째 장소에있는 제네릭 클래스의 목적. 그러나 정확한 것 같습니다. –

+1

@ArturoHernandez 매개 변수가 실제로 'MyExtendedType'이라는 것을 모른 채 어떻게'Bar '를 호출 할 수있을 것으로 예상합니까? Generics를 사용하면 하나 이상의 유형이있는 동작 패턴을 컴파일 타임에 정확히 알지 못하는 상태에서 만들 수 있지만 패턴을 설정하기 위해 이러한 유형을 사용하여 수행 할 수있는 작업을 알아야합니다. –

+0

@ArturoHernandez 인터페이스'ISource'를 정의하고 Bar를'Bar (ISource source)'로 정의한 다음'TFrom : ISource'라는 제약 조건을 사용하는 것이 좋습니다. 그렇게하면 일반 클래스가 훨씬 더 다양한 유형 매개 변수와 호환 될 것입니다. –

관련 문제