假设我有一堂课,列表如下:
static class Accounts
{
public static List<Account> Items;
...
}
我有一种方法可以启用 foreach,这样我就可以在不引用 Items 列表的情况下执行 foreach,例如:
foreach(Accounts 中的账户) ?
假设我有一堂课,列表如下:
static class Accounts
{
public static List<Account> Items;
...
}
我有一种方法可以启用 foreach,这样我就可以在不引用 Items 列表的情况下执行 foreach,例如:
foreach(Accounts 中的账户) ?
不可以。根据 C# 5.0 规范的第 10.1.1.3 节,静态类不能实现接口。
静态类声明受以下限制:
...
- 静态类可能不包括基于类的规范(第 10.1.4 节),并且不能显式指定基类或已实现接口的列表。静态类隐式继承自类型对象。
...
因此,没有办法实现IEnumerable
,这就是foreach
工作原理。
我探索了利用foreach
将查找成员查找或未GetEnumerator
找到接口这一事实的选项,但这也不起作用,因为不幸的是,期望的expr
参数foreach
不支持类型名称。
最好的选择是让它不是静态的,而是遵循单例模式。也就是说,有一个静态属性是类的唯一允许的实例。但这并不能消除读取属性的需要,因此无论如何它不会真正为您提供任何东西。
如果您只是想掩盖实现(良好的调用),您可以创建 type 的属性IEnumerable<Account>
,然后将其设置为等于(无论您在哪里执行此操作)为 new List<Account>
。然后,按照合同,您不允许其他类修改列表,并且您没有将它们耦合到实现。无论如何,这些都是实现IEnumerable
这样的东西的主要优点。所以这应该足够了。
为什么不直接使用列表?
foreach (Account account in Accounts.Items)
如果你想实现这个,你需要继承IEnumerable接口并实现它的行为。
在我看来,这样做会比直接使用列表更令人困惑。