5

私が使用している既存のフレームワークのため、メソッド呼び出しはSortedListオブジェクトを返しています。この呼び出しの反対側を書いたので、それが実際にはSortedListであることがわかります。私はSortedListで作業を続けることができますが、ジェネリックを使用すると私の意味がよりよく伝わります。では、非ジェネリックのSortedListを適切に型指定されたジェネリックのSortedListにどのように変更しますか?

この背景には、呼び出しがSoapFormatterを使用したリモートプロシージャコールであることがあります。SoapFormatterはジェネリックを実装していません(ありがとう、Microsoft)。一部の非.Netプログラムもサービスに対して他のメソッド呼び出しを使用するため、フォーマッターを変更できません。

プロキシ呼び出しを次のようにしたいと思います。

public SortedList<string, long> GetList(string parameter)
{
    return _service.GetList(parameter);
}

SoapFormatterの要件により、GetList呼び出しのインターフェイスは次のようになります。

public SortedList GetList(string parameter);
4

2 に答える 2

6

型の要素のみが含まれている場合でも、 aSortedListは実際にはではないため、直接変換することはできません。SortedList<T>T

これを適切なタイプに変換するには、を作成してSortedList<T>すべての要素を追加する必要があります。

于 2012-08-08T21:56:53.227 に答える
4

使用法の変換関数:

static SortedList<TKey,TValue> StronglyType<TKey,TValue>(SortedList list) {
    var retval = new SortedList<TKey,TValue>(list.Count);
    for(int i=0; i<list.Count; i++) 
        retval.Add((TKey)list.GetKey(i), (TValue)list.GetByIndex(i));
    return retval;
}

foreach(DictionaryEntry entry in list)ボックスを解除するための暗黙のキャストのため、同等のアプローチは少し遅くなりDictionaryEntryます(常にTKey / TValueへのキャストが必要です)。

Ballparkのパフォーマンスのオーバーヘッド:ここにある私の古いマシンでは、この関数は、それぞれ1000エントリの1000リストを変換するのに100ミリ秒かかります。

于 2012-08-08T22:14:17.690 に答える