在通用类型约束中,是否可以指定其必须实现一个通用类型?

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<TElement>实现了IEnumerable<TElement>,那么你最好将限制设置在IEnumerable<TElement>上。 - Aliostad
@Aliostad:请看编辑。我想在函数被调用时设置“TElement”,而不是将其作为接口的类型参数。 - Jean Hominal
“Element”和“Entity”是不同的东西吗? - AakashM
TElement 是一个类型参数,仅用于指定 TSet 是具有一个类型参数的泛型类型。当调用方法 GetSet 时,TEntity 是提供的类型参数。 - Jean Hominal
2个回答

5
您需要使用两个通用类型来实现这一点,例如:
public interface IRepository<TCollection, TItem> where TCollection : IEnumerable<TItem>
{
    TCollection GetSet<TItem>();  
}

(我假设原文中的 TEntity 应该是 TElement...)
话虽如此,最好还是写成这样:
public interface IRepository<T>
{
    IEnumerable<T> GetSet<T>();  
}

这是一种更常见的实现上述目标的方法。

请查看编辑:我不想在接口中同时设置可枚举类型的参数类型,而是只在调用GetSet方法时设置。 - Jean Hominal

0
最终,这似乎是不可能的。
我最终通过定义自己的接口来解决了这个问题: public interface IRepository { IMySet GetSet(); }
我将DbSetObjectSet都包装在实现这些接口的对象中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接