有一种列表容器(例如我无法修改的MyList)但只声明了GetCount()和At()方法。
我想在MyList中使用foreach语句,所以我写了像bellow一样的扩展方法。
public static class MyListHelper
{
public static IEnumerable<MyListItemType> GetEnumerator(this MyList list)
{
for (int i = 0; i < list.GetCount(); ++i )
{
yield return list.At(i);
}
}
}
但如果我编码' foreach(MyListItemType i in list)...... ',编译器呕吐'MyList不包含GetEnumerator'的piblic定义。
我可以直接调用GetEnumerator()方法并且正常工作。
我应该为此做些什么呢?
答案 0 :(得分:3)
如果您无法直接编辑MyList
(非静态)类的代码,则可能必须使用扩展方法ToIEnumerable
或类似方法。也许是这样的:
public static class MyListExtensions
{
public static IEnumerable<MyListItemType> ToIEnumerable(this MyList list)
{
return new Wrapper(list)
}
private class Wrapper : IEnumerable<MyListItemType>
{
readonly MyList list;
public Wrapper(MyList list)
{
this.list = list;
}
public IEnumerator<MyListItemType> GetEnumerator()
{
for (int i = 0; i < list.GetCount(); ++i )
{
yield return list.At(i);
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
}
答案 1 :(得分:2)
更改MyList
以实施IEnumerable或IEnumerable<T>
界面。这包括GetEnumerator。
答案 2 :(得分:1)
您的MyList
需要实施界面IEnumerable
public class MyList:IEnumerable<MyListItemType>
{
public IEnumerable<MyListItemType> GetEnumerator()
{
...
}
}