>我创建了一个包装列表的类:
class Wrapper
{
private List<int> _list
}
我希望能够像这样初始化一个新的包装器对象:
new Wrapper() {1, 2, 3};
这应该将包装器_list
初始化为包含 {1, 2, 3} 的列表。
我需要向类代码添加什么才能启用该功能?
你需要
两样东西:
- 您需要实现
IEnumerable
(尽管对于集合初始值设定项本身而言,它的行为并不重要)。您不必实现通用版本,但您通常需要实现。 - 您需要一个接受元素类型作为参数的
Add
方法(在本例中int
)
因此,编译器将对此进行转换:
Wrapper x = new Wrapper() {1, 2, 3};
进入这个:
Wrapper tmp = new Wrapper();
tmp.Add(1);
tmp.Add(2);
tmp.Add(3);
Wrapper wrapper = tmp;
最简单的方法几乎可以肯定是委派到您的列表:
class Wrapper : IEnumerable<int>
{
private readonly List<int> _list = new List<int>();
public IEnumerator<int> GetEnumerator()
{
return _list.GetEnumerator();
}
// Explicit implementation of non-generic interface
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void Add(int item)
{
_list.Add(item);
}
}
如果你想让你的包装器稍微更有效的迭代,你可以改变GetEnumerator
方法,包括一个返回List<T>.Enumerator
的公共方法:
// Public method returning a mutable struct for efficiency
public List<T>.Enumerator GetEnumerator()
{
return _list.GetEnumerator();
}
// Explicit implementation of non-generic interface
IEnumerator<int> IEnumerable<int>.GetEnumerator()
{
return GetEnumerator();
}
// Explicit implementation of non-generic interface
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
class ListWrapper :IEnumerable<int>
{
private List<int> _list = new List<int>();
public void Add(int i)
{
_list.Add(i);
}
public IEnumerator<int> GetEnumerator()
{
return _list.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return _list.GetEnumerator();
}
}