我想使用foreach语句迭代对象

时间:2012-09-19 07:52:07

标签: c# extension-methods

有一种列表容器(例如我无法修改的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()方法并且正常工作。

我应该为此做些什么呢?

3 个答案:

答案 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以实施IEnumerableIEnumerable<T>界面。这包括GetEnumerator

答案 2 :(得分:1)

您的MyList需要实施界面IEnumerable

public class MyList:IEnumerable<MyListItemType>
{
    public IEnumerable<MyListItemType> GetEnumerator()
    {
        ...
    }
}