2

私たちは非常に古いコードベースを持っています (それは実際にはひどい品質ではありません)。これは、.Net がプレリリースされたときにさかのぼります。これが、これらの奇妙な規則のいくつかの原因であると思われます。

とにかく、私たちは .Net 1.1 のサポートを終了し始めたばかりで、ものをジェネリックに変換したり、Linq を使用したり、楽しいことをしたりして、干し草の日を過ごしています。コードベースで最も面倒なパターンの 1 つは、次のようなものがあることです。

private ArrayList mylist;
public IEnumerator MyList
{
  get
  {
    if(mylist==null)
      return new EmptyEnumerator.Enumerator;
    return mylist.GetEnumerator();
  }
}

このパターンはforeach(var item in MyList)、IEnumerator が IEnumerable を実装していないため、単純に実行できないため、特に恐ろしいものです。代わりに、次のようにする必要があります。

IEnumerator enumerator=MyList;
while(enumerator.MoveNext())
{
    object item=enumerator.Current;
}

ReadOnlyCollection<T>したがって、リファクタリングには、もちろん、またはIList<T>類似のものを使用したいと考えています。ただし、これを行うには、do へのすべての参照を更新するMyList必要があります。

IEnumerator enumerator=MyList;

IEnumerator enumerator=MyList.GetEnumerator();

場合によっては、1 つのプロパティへの参照が 100 を超えることもあります。これを簡単にするツールはありますか?最近、Resharper を入手しましたが (この問題のためではなく、一般的な使用のためだけに)、このタイプのシナリオには対応していないようです。

4

1 に答える 1

4

あなたがする必要があるように聞こえるのは、 と の両方を実装するクラスを返すことIEnumeratorですIEnumerable<T>

これを行う独自の型を作成することは、実際にはそれほど難しくありません。

public class MessedUpIterator<T> : IEnumerable<T>, IEnumerator
{
    private IEnumerable<T> source;
    private IEnumerator enumerator;

    private IEnumerator MyEnumerator
    {
        get
        {
            return enumerator ?? source.GetEnumerator();
        }
    }

    public MessedUpIterator(IEnumerable<T> source)
    {
        this.source = source;
    }
    public IEnumerator<T> GetEnumerator()
    {
        return source.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return source.GetEnumerator();
    }

    object IEnumerator.Current
    {
        get { return MyEnumerator.Current; }
    }

    bool IEnumerator.MoveNext()
    {
        return MyEnumerator.MoveNext();
    }

    void IEnumerator.Reset()
    {
        MyEnumerator.Reset();
    }
}

anまたは an のいずれかを返す代わりに、両方を行うものを返すことができます。IEnumeratorIEnumerable<T>

IEnumeratorは明示的に実装されているのに対し、IEnumerable<T>は暗黙的に実装されてIEnumerableいるIEnumerator ことに注意してください。

はい、それは醜いですが、確かにもっと悪いかもしれません.

于 2012-10-19T20:48:56.503 に答える