2

有一种列表容器(例如,我无法修改的 MyList),但仅声明了 GetCount() 和 At() 方法。

我想对 MyList 使用 foreach 语句,所以我编写了如下扩展方法。

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() 方法并且工作正常。

我应该为此多做些什么?

4

3 回答 3

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();
    }
  } 
}
于 2012-09-19T07:56:46.717 回答
2

更改MyList以实现IEnumerableIEnumerable<T>接口。这包括GetEnumerator

于 2012-09-19T07:54:29.327 回答
1

MyList需要实现接口IEnumerable

public class MyList:IEnumerable<MyListItemType>
{
    public IEnumerable<MyListItemType> GetEnumerator()
    {
        ...
    }
}
于 2012-09-19T07:57:07.350 回答