2016-07-05 5 views
3

汎用に渡されたディクショナリを繰り返し処理しようとするときに問題があります。たとえば、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... 

どのようにすればいいですか?

+0

Reflectionを使用しますか? 'オブジェクトキーkvp.GetType()。GetProperty(" Key ")。GetValue(kvp); オブジェクト値kvp.GetType()。GetProperty( "Value")。GetValue(kvp); ' 非常に最適化されていませんが、動作することができます... – Dede

+0

恐ろしく、ありがとうDede ...この機能は既に反射を多用しているので、それについて心配する必要はありません。 –

+0

列挙子のある部分は、関数 'Load 'のこの部分ですか、それとも' Load 'の外ですか?なぜなら、それが外にあると、 'Dictionary 'で提供されている正確な 'GetEnumerator'メソッドを使うのはなぜですか? – ckruczek

答えて

2

試しdynamic kvp = resultIdx.Current;を追加します。次に使用できますkvp.Value

1

のように2つの関数に関数を書き換えることができます。

public T Load<T>(...) 
//Or maybe public List<T> Load<T>(...) 

public Dictionary<long, T> LoadD<T>(...) 

次に、あなたはLoadDにKeyValuePair<long, T>に結果をキャストすることができます。 LoadDに呼び出して、コードの書き換えを最小限に抑えることができます。コメントでデデによって提供さ

+0

長い(この場合))がデータベースの主キーを表すので、私は公開の辞書 LoadD (...)を避けたかったのです。しかし、これは完全に可能なプライマリキーは、他の型、または型の組み合わせです。オーバーロードされたLoad()関数のスタック全体を記述したくありませんでした。 –

+0

@ThereandThatどうすれば 'Dictionary LoadD (...)'? :) –

0

回答:

"?使用リフレクション

object key kvp.GetType().GetProperty("Key").GetValue(kvp); 
object value kvp.GetType().GetProperty("Value").GetValue(kvp); 

非常に最適化されたが、仕事ができるわけではありません... - デデ24"

関連する問題