1

Fiddler の HTTPHeaders クラスにStorageは、List<HTTPHeaderItem>.

HTTPHeaders クラスは、次のように .NET 1.1 スタイルで列挙子を公開しますpublic System.Collections.IEnumerator GetEnumerator()。このメソッドは単純に を返しますStorage.GetEnumerator()

質問:

  1. 実装しないとパフォーマンスが低下しIEnumerable<HTTPHeaderItem>ますか? foreach(HTTPHeaderItem in oHTTPHeaders)それとも、返されたオブジェクトが型固有のバージョンの IEnumerable も実装していることを認識し、一連のキャストを回避するほど、のコンパイルはスマートですか?

  2. 古い GetEnumerator() メソッドを (明示的なインターフェイスの実装を介して) 非表示にせずに実装することさえ可能ですか? 古いメソッドを非表示にすると、従来の拡張機能 ( 「.」など)とのIEnumerable<HTTPHeaderItem>バイナリ互換性が失われます。Method not found: 'System.Collections.IEnumerator Fiddler.HTTPHeaders.GetEnumerator()

結果

*以下の Servy の回答で指摘されているように、型に特化した Enumerator を返す public GetEnumerable() を追加するときに、バイナリ互換性を損なうことを回避する簡単な方法はありません。

ただし、私の特定のシナリオでは、少し幸運でした。HTTPHeaders は基本クラスであり、実質的にすべての呼び出し元が 2 つの派生クラス (HTTPRequestHeaders および HTTPResponseHeaders) のいずれかを使用しています。パブリックのジェネリック GetEnumerator() メソッドをそれぞれの派生クラスの両方に追加しました。これらの新しいタイプ固有の列挙子は、新しいバージョンに対してコンパイルされたコードによって呼び出されますが、再コンパイルされていない古いプラグインは、依然として基本クラスから非ジェネリックの列挙子を取得します。

4

1 に答える 1

5
  1. キャストを回避するために、実際のHTTPHeaderItemタイプを返すGetEnumeratorメソッドを提供する必要があります。これはIEnumerable<HTTPHeaderItem>、1つの暗黙的GetEnumeratorなメソッドを実装するか、実際の型を返すようにすることを意味します。一般的な場合、これはダックタイピングに依存でき、実装しないことを意味しますIEnumerable<T>が、あなたの場合、そのようなメソッドは間違った署名ですでに存在するため、それは不可能です。

  2. もちろん。IEnumerable<HTTPHeaderItem>実装の代わりに実装を非表示にするだけIEnumerableです。これはまさにアレイが行うことです(バイナリ互換性を維持するため)。

簡単な例を次に示します。

public class Foo : IEnumerable, IEnumerable<HTTPHeaderItem>
{

    public IEnumerator GetEnumerator()
    {
        throw new NotImplementedException();
    }

    IEnumerator<HTTPHeaderItem> IEnumerable<HTTPHeaderItem>.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}
于 2013-01-31T20:24:04.180 に答える