在試圖實現存儲庫模式時,我遇到了一個我所關心的小問題,實際上隱藏了更大的問題。鑄造,泛型和子類型
我有一個DatabaseEntity <T>
,我正在使用它來處理所有基本的CRUD操作,並且所有其他需要存儲在數據庫中的類將從其中下載。對於直接從它繼承的類來說,它工作得很好,但是當它與具有中間父類的類一起使用時,我遇到了問題。
假設我有其他三個班,家長,ChildA和ChildB和和繼承的樣子:
DatabaseEntity
|
家長
| |
ChildA ChildB
還假定DatabaseEntity <T>
具有以下簽名的方法:
public static T FindBy(int id)
我遇到的問題是,當我嘗試類似:
ChildA Foo = ChildA.FindBy(SomeID);
我得到一個編譯器錯誤,告訴我沒有從Parent到ChildA的隱式轉換。這是因爲Parent是將類型參數傳遞給ChildA和ChildB的DatabaseEntity的類。簡單解決方法我認爲,只需向Parent添加一個類型參數,然後傳遞適當的類型。只需等待一秒,然後我必須在任何時候使用Parent來明確定義子類型,這會破壞任何多態性。不,再次想到也許這不是一個很好的解決方案。
我想我可以只刪除該類型參數在類DatabaseEntity本身,讓每個方法需要一個類型參數,但後來我不得不這樣做:
ChildA Foo = ChildA.FindBy<ChildA>(SomeID);
雖然可以編譯,它似乎不太乾淨,當然需要更多的打字。 Visual Studio中問,如果我缺少強制,雖然其真正的我可以投我的第一個例子中其唯一一個時間的問題之前,我不小心輸入了:
ChildB Foo = (ChildB) ChildA.FindBy(SomeID)
我不與任何特別高興我想到的解決方案迄今爲止,我希望這裏有人能指出我錯過的優雅的一個。
哪個.Net版本受到限制? – Adrian 2011-02-17 02:55:04
您需要一個支持LINQ操作的ORM,那麼您可以使用`OfType`來完成父代到孩子之間的轉換。 –
RPM1984
2011-02-17 03:11:36