汎用に渡されたディクショナリを繰り返し処理しようとするときに問題があります。たとえば、DBからデータを読み込む関数があります。C#ディクショナリを継承したものが汎用として渡される
public T Load<T>(...)
この関数は、問題なく使用できます。
someclasstype data = Load<someclasstype>(...);
List<someclasstype> data = Load<List<someclasstype>>(...);
私は最近、これも同様の辞書を扱うことができるように拡張しようとしました、そしてそうのようにそれを呼び出しました:
Dictionary<long, someclasstype> data = Load<Dictionary<long, someclasstype>>(...)
私は問題なくデータをロードし、それを保存することができます辞書に問題はありません。この段階で
、そのすべてのkeyvaluepairsと辞書は、結果という変数に格納され、私はこれまでのところ
IEnumerator resultIdx = ((IEnumerable)result).GetEnumerator();
if (!resultIdx.MoveNext())
return (T)result;
object kvp = resultIdx.Current;
でとても良いのIEnumerableを作成しています。私は、キーの値と時計の値の値、またはkvp変数のマウスオーバーによって値を見ることができます。
しかし、私はkvpからkeyvalueペアの値の部分を取得する方法を見つけることができません。
// None of these work - I get compile time errors, unboxing errors, or invalid cast errors.
object item = ((KeyValuePair<TKey, TValue>)kvp).Value;
object item = ((KeyValuePair<long, object>)kvp).Value;
object item = ((T)kvp).Value // Never had a hope for this, but desperation...
どのようにすればいいですか?
Reflectionを使用しますか? 'オブジェクトキーkvp.GetType()。GetProperty(" Key ")。GetValue(kvp); オブジェクト値kvp.GetType()。GetProperty( "Value")。GetValue(kvp); ' 非常に最適化されていませんが、動作することができます... – Dede
恐ろしく、ありがとうDede ...この機能は既に反射を多用しているので、それについて心配する必要はありません。 –
列挙子のある部分は、関数 'Load 'のこの部分ですか、それとも' Load 'の外ですか?なぜなら、それが外にあると、 'Dictionary 'で提供されている正確な 'GetEnumerator'メソッドを使うのはなぜですか? –
ckruczek