2011-03-16 91 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都包装在实现这些接口的对象中。