2014-02-18 68 views
1

我有一個interfaceC#團結泛型接口和抽象類

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

abstract類實現:

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); 
    } 
} 

知道:

public class EventAfterMigration : BaseEvent 

我想怎麼做理想:

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

,並具有在我的配置文件:

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

我知道這似乎是抽象的,我測試過了很多的的可能性,但每次我得到InvalidCastException,說

MigrationSchemaImpl cannot be cast to IMigrationSchema1[BaseEvent]

我覺得這是完全可行的,但我錯過了一些簡單的東西。任何幫助感謝!

+0

您是否在IMigrationSchema1 [[MyApp.BaseEvent,MyApp]]''中嘗試了''1'? – jcharlesworthuk

+0

是的,也不起作用。 – LaurentH

回答

0

類型之間的關係並不奇蹟般地成爲使用此類型的通用接口/類型之間的關係。 MigrationSchemaImpl implements IMigrationSchema<EventAfterMigration>,而不是IMigrationSchema<BaseEvent> - 所以你不能投一個到另一個(有或沒有統一)。

你會用簡單的代碼得到同樣的錯誤:

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

您可以嘗試使用varianceIMigrationSchema<in BaseEvent>(不知道它會在你的情況下幫助)。

+0

你有什麼問題,我認爲這只是一個類型:MigrationSchemaImpl implments MigrationSchema,它實現了IMigrationSchema。問題是,即使在統一的情況下,如果我將IMigrationSchema(非通用版本)映射到MigrationSchemaImpl,它也能正常工作。我非常肯定它與我使用泛型的事實有關,並且我得到了統一的語法錯誤! – LaurentH

+0

@LaurentH - 你說得對 - 應該是「'MigrationSchemaImpl'實現'IMigrationSchema ',而不是'IMigrationSchema '」(修復)。這個想法仍然是一樣的 - 在不兼容的類型,如'IMigrationSchema '和'IMigrationSchema'之間,統一不能奇蹟般地施展。 –