2013-05-26 72 views
0

我有一個基本類型B和多個派生子類型,C1:B,C2:B,C3:B等C#通行證發揮功能的子列表作爲基礎列表

我有每個孩子的列表類型,ListL1,ListL2,ListL3。

對於每個孩子類型,我都有工作函數F1,F2,F3,它們爲那個孩子取得相應的列表L1,L2,L3,並完成本質上相同的功能(僅處理B的屬性),但對於相應的類型,C1,C2,C3。

我希望有一個函數,基於列表的基本類型,列表「多態」執行函數獨立於子類型。

我知道,我應該能夠通過與模板符我的函數聲明固定在-列表傳遞到我的功能,是這樣的:

public void Fn<T>(List<T> BList) { /* do stuff */ } 

我希望我的每一個孩子的功能,F1, F2,F3,調用基函數,像

public void F1(List<C1> L1) 
{ 
    Fn(L1); // this is the line that fails 
} 

我試圖重鑄爲基型,B

Fn((List<B>)L1); 

但是,我得到一個錯誤說我不能轉換型「System.Collections.Generic.List」到「System.Collections.Generic.List」即使C1從B.

我已經得出也試過在FN名infixing類型:

Fn<C1>(L1); 

Fn<C1>( (List<B>)L1); 

我發現建議說,我要投我的孩子名單作爲基類列表(失敗對我來說)和我的泛型函數中,FN,檢查無論我的傳遞列表是否爲特定類型,然後執行特定於該類型的單獨代碼。除了推薦的不適合我的工作外,這似乎打敗了OOP的多態性,以便在泛型函數中仍然具有子類專用代碼。

我希望有一些真正的抽象/通用手段,通過它不重複代碼,從而將我的子列表視爲基礎列表。

任何人都可以告訴我如何做到這一點?

謝謝。

回答