2010-02-16 57 views
2

我正在考慮在決定業務線庫之前實現按對象存儲庫(例如Person存儲庫,State存儲庫等)相反,但我仍然有一個關於通過一個ID(標識符)類型與一個通用的問題。如何指定泛型類型的標識符類型(用於db查詢)以及genric類型

簡而言之,一個人可能有一個GUID標識符,州/縣可能有一個int標識符等。記住這一點,我該如何傳遞一個類型來指定ID,呃,類型泛型被傳入?

這是我在界面的嘗試:

public interface IRepository<T, TID> where T : class where TID : Type 
{   
    T Get(TID id); 
    IList<T> GetAll(); 
    void Update(T entity); 
    void Insert(T entity); 
    void Delete(TID id); 
} 

你可以看到,T是類(人,國家等),我的意圖是讓TID是用於標識類型,即查看T Get(TID id)。

這樣做會產生編譯錯誤:「類型'字符串'不能用作泛型類型或方法'DumpWebApp.IRepository'中的類型參數'TID'。'string'沒有隱式引用轉換。 '系統類型'。」

這樣做的另一種方法是將實際的元素傳遞給Get和Delete方法,我猜,但看起來有點笨拙。

感謝您的任何建議 - 順便說一句,返回IList可以接受的GetAll()?爲什麼不是IQueryable或T []?

邁克K.

回答

2

剛落where TID : Type約束。這應該夠了吧。

+0

好的,這就像一個魅力,我認爲這是變化?謝謝你的指針:-) – 2010-02-16 12:58:38

+0

@Mike:不,與方差無關。使用'Type'作爲通用約束不是「任何類型」的簡寫。 'System.Type'是它自己的獨特類。如果你想允許任何類型的'TID',那麼就完全跳過這個約束。 – LukeH 2010-02-16 13:14:20

+0

好的,那麼<>中的第二個參數究竟代表什麼?我猜這是通用的類型,很明顯,但想知道這個問題... – 2010-02-16 14:02:05

1

IQueryable no。 IList是的。數組是肯定的。 IList是安全的。

你的TID約束是說TID將是Type類型。

下降。

+0

大聲笑。猜我應該加載答案 – 2010-02-16 12:52:26

+0

我不能相信它得到答案,很快! :-s你們在FIRE :-) – 2010-02-16 13:37:10