2010-08-11 94 views
2

我正在構建一個實體庫,我有一個接口,IIdentifiable<T>。因此,例如,由Guids標識的實體實施IIdentifiable<Guid> with public Guid Id { get; }。到現在爲止還挺好。冗餘泛型參數?

我有一個接口IRepository<T, TIdentifier> where T : IIdentifiable<TIdentifier>

在我看來,TIdentifier泛型參數是多餘的,因爲已經有的信息保存在T的泛型參數中。有沒有什麼辦法可以讓我有一個更清晰的IRepository實現,我只需要指定T in我的商業代碼?

我在類似'IRepository<T> where T : IIdentifiable<T.GenericArgs[0]>之後。

我懷疑這是可能的,但只是想我會問。也許新的C#4東西有這個東西呢?

回答

2

T沒有限制,這要求它是一個通用的。並且沒有什麼能夠阻止班級實施IIdentifiable<T1>,IIdentifiable<T2>,... IIdentifiable<Tn>,所以即使一些語法「接口的第一個參數由T實現」也是不夠的。

0

基於假定類型已經滿足該限制,您可以指定一個限制,將編譯器置於邏輯悖論中。

此外,您的計劃使TIdentifier未知在IRepository其中,我認爲它將需要知道。

1

您可以創建一個IIdentifiable,它具有object Id { get; },然後IIdentifiable<T> : IIDentifiable具有通用的Id屬性。

然後你就可以通用參數的數量減少到1,像這樣:

IRepository<T> where T : IIdentifiable 

在實踐中,你會再使用IRepository<X>X : IIdentifiable<Guid>

這是假設你的IRepository主要是興趣的能力T有一把鑰匙,並且不專注於特定類型的鑰匙。

+0

事情是通用的Id屬性會隱藏非通用的一個 – 2010-08-13 11:52:36

+0

嗯,因爲它們是接口,它不是'真正'隱藏。據推測,非通用的顯式實現將只是調用通用的Id屬性 – cordialgerm 2010-08-19 07:00:01