2014-02-18 3 views
1

나는이 interface : 다음C# 화합 제네릭 인터페이스와 추상 클래스

public abstract class MigrationSchema<T> : IMigrationSchema<T> 
{ 
    public abstract T MapEvent(IOtherEvent sourceEvent); 
} 

MigrationSchema의 실제 구현 :

public class MigrationSchemaImpl: MigrationSchema<EventAfterMigration> 
{ 
    public MigrationSchemaImpl() 
     : base() 
    { 
    } 

    public override EventAfterMigrationMapEvent(IOtherEvent actualSourceEvent) 
    { 
     return new EventAfterMigration(actualSourceEvent); 
    } 
} 
abstract 클래스에 의해 구현

public interface IMigrationSchema<T> 
{ 
    T MapEvent(IOtherEvent sourceEvent); 
} 

:

public class EventAfterMigration : BaseEvent 

것은 내가 이상적으로 할 싶습니다 무엇 :

var migrationSchema = container.Resolve<IMigrationSchema<BaseEvent>>(); 

내 config 파일에서 가진 :이 추상적 인 것 알고

<register type="IMigrationSchema`1[[MyApp.BaseEvent, MyApp]]" mapTo="MigrationSchemaImpl"> 

, 나는 많은을 테스트 한을 가능성은 있지만 언제든지 InvalidCastException이 표시되면서 해당

MigrationSchemaImpl cannot be cast to IMigrationSchema1[BaseEvent]

나는 이것이 완벽하게 실현 될 수 있다고 생각하지만 나는 간단한 것을 놓치고있다. 어떤 도움을 주셔서 감사합니다!

+0

IMigrationSchema'1 [[MyApp.BaseEvent, MyApp]]'에서 ''1 '없이 시도한 적이 있습니까? – jcharlesworthuk

+0

그래, 작동하지 않습니다. – LaurentH

답변

0

유형 간의 관계는이 유형을 사용하는 일반적인 인터페이스/유형간에 불가분의 관계가되지 않습니다. MigrationSchemaImplIMigrationSchema<BaseEvent>이 아닌 IMigrationSchema<EventAfterMigration>을 구현하므로 하나를 다른 것으로 캐스팅 할 수 없습니다 (유니티 유무에 관계없이).

당신은 간단한 코드와 같은 오류가 발생합니다 :

var base = (IMigrationSchema<BaseEvent>) 
    (new MigrationSchemaImpl()); 

당신은 (그것이 당신의 경우에 도움이 될 것입니다 있는지 확실하지 않습니다) IMigrationSchema<in BaseEvent> 같은 variance를 사용하려고 할 수 있습니다.

+0

당신은 뭔가 잘못 됐어, 나는 그것이 단지 유형이라고 생각한다. MigrationSchemaImpl은 IMigrationSchema를 구현하는 MigrationSchema를 암시한다. MigifySchemaImpl에 IMigrationSchema (비 제네릭 버전)를 매핑하면 문제가 발생하지 않습니다. 저는 제네릭을 사용한다는 사실과 관련이 있으며, 통일 구문을 잘못 알고 있다고 확신합니다! – LaurentH

+0

@LaurentH - 맞습니다 - "MigrationSchemaImpl'은'IMigrationSchema '"(고정)이 아닌'IMigrationSchema '를 구현해야합니다. 아이디어는 여전히 동일합니다. 즉, 'IMigrationSchema '및 'IMigrationSchema '과 같은 호환되지 않는 유형 간에는 단합 할 수 없습니다. –

관련 문제