2011-03-16 90 views
6

這裏是我想做些什麼:可以在泛型類型約束上指定它必須實現泛型類型嗎?

public interface IRepository<TSet<TElement>> where TSet<TElement> : IEnumerable<TElement> 
{ 
    TSet<TEntity> GetSet<TEntity>(); 
} 

在.NET是這樣的結構可能嗎?

編輯:這個問題還不夠清楚。這是我想做的事,擴大:

public class DbRepository : IRepository<DbSet<TElement>> { 
    DbSet<TEntity> GetSet<TEntity>(); 
} 

public class ObjectRepository : IRepository<ObjectSet<TElement>> { 
    ObjectSet<TEntity> GetSet<TEntity>(); 
} 

含義,我想約束類型: - 接受單個泛型參數 - 實現給定的一個泛型參數界面。

這可能嗎?事實上,我只會對第一件事感到高興。

public interface IRepository<TGeneric<TElement>> { 
    TGeneric<TArgument> GetThing<TArgument>(); 
} 
+1

這是可能的,但有什麼意義?如果'TSet '實現'IEnumerable ',那麼您可以在'IEnumerable '上設置限制。 – Aliostad 2011-03-16 15:57:10

+0

@Aliostad:查看編輯。我只想在函數被調用時設置「TElement」,而不是在界面上作爲類型參數。 – 2011-03-16 16:43:27

+0

'元素'和'實體'是不同的東西嗎? – AakashM 2011-03-16 16:47:43

回答

5

您需要使用兩個泛型類型來實現這一點,如:

public interface IRepository<TCollection, TItem> where TCollection : IEnumerable<TItem> 
{ 
    TCollection GetSet<TItem>(); 
} 

(我假設TEntity本來應該在原TElement ...)

這就是說,最好寫一些類似的東西:

public interface IRepository<T> 
{ 
    IEnumerable<T> GetSet<T>(); 
} 

這將是實現上述目標的更常見手段。

+0

請參閱編輯:我不想爲接口同時設置enumerable的參數類型,但只有在調用GetSet方法時纔可以。 – 2011-03-16 16:40:01

+0

經過審查,這實際上是正確的答案。 – 2012-12-14 12:12:46

0

最後,這似乎不可能。

我終於周圍的工作通過定義自己的接口:

公共接口IRepository { IMySet GETSET(); }

而且我將DbSetObjectSet都包裝在實現這些接口的對象中。