【发布时间】:2017-06-21 00:26:12
【问题描述】:
我正在尝试在这样的界面中创建属性列表:(仅使用 1 个属性作为示例)
public interface IRepository
{
IEnumerable<Budget> Budgets { get; set; }
}
但我希望能够使用IEnumerable<T> 的不同实现来创建它的实现。因此,例如,我希望能够实现 IRepository 并将“预算”作为列表或 DbSet(或我创建的任何其他实现 IEnumerable<T> 的自定义类)
我希望我能做这样的事情:
public interface IRepository<T>
{
// Database
T<Budget> Budgets { get; set; }
}
或
public interface IRepository<T>
where T : IEnumerable<>
{
// Database
T<Budget> Budgets { get; set; }
}
然后我可以这样实现它:
public class Repository : IRepository<List>
{
List<Budget> Budgets { get; set; }
}
但它的语法无效。
这有可能吗?如果没有,我还有什么选择?
【问题讨论】:
-
只是好奇:你为什么要这个?
-
嘿 Luke 看看“存储库”模式,这正是你想要的!
-
您可以在通用接口
IRepository<T> where T : IEnumerable<Budget>上指定T Budgets { get; }。但是为了什么目的.. 接口可能是非通用的暴露IQueryable或IEnumerable -
@Bas 我想这样做的主要原因是因为我想实现多个类似“存储库”的类,它们都具有相同类型的属性(例如预算)但具有不同的 IEnumerable 实现。如果我把它做成简单的 IEnumerable
那么我所有的实现都是 IEnumerable 并且我必须进行强制转换才能获得我不想做的 List 或 DBSet (或其他)。