2013-05-12 10 views
5

を知らなくても辞書のキーと値のペアを取得します。私の質問は、実際にジェネリック型を知らなくても、このオブジェクトからキーと値のペアをどのように抽出できますか?私はKeyValuePair<object, object>[]のようなものを取得したいと思います。私はまた、実行時にディクショナリが使用するジェネリック型も知っていることに注意してください(コンパイル時ではありません)。私は何らかの反射が必要だと思いますか?私は</p> <pre><code>instance.GetType().GetGenericTypeDefinition() == typeof(Dictionary<,>) </code></pre> <p>が真である<code>instance</code>するオブジェクトを持って、その型

フォローアップ:SomeClass<>objectを変換する(私が知っていればそれは当然の正しいタイプ、である)ので、それを使用する一般的なメカニズムは、クラスの実装はに影響されないことを考えると、あります一般的な議論のタイプ?迅速な解決のために

+0

または非総称の「IDictionary」インターフェイス。 – SLaks

+0

それは良い点です。私は特に 'Dictionary <,>'の答えを探していますが、一般的な引数を必要とするオブジェクトを動的にキャストして使用できる方法があるかどうかを知りたいと思います。 – nickolayratchev

+0

IDictionaryの 'ToList'はKeyValuePairsのリストを返します:' var keyValuePairList = instance.ToList(); '。それは(あなたのフォローアップの前に)あなたの探しているものですか?または私は何かを逃していますか? –

答えて

4

私はジェレミー・トッドは、多分少し短く除い言っただろう。

foreach(var item in (dynamic)instance) 
    { 
     object key = item.Key; 
     object val = item.Value; 
    } 

そして、サイドノートとして(ありませんもし有用なら確かに)、次のような引数の型を得ることができます:

Type[] genericArguments = instance.GetType().GetGenericArguments(); 
+0

私はこのダイナミックをインデクサー構文を使って値を取得するために使うこともできると付け加えたいと思います: '(myDictonary as dynamic)[" someKeyValue "]' –

3

、あなただけdynamicを使用することができます。

Dictionary<string, int> myDictionary = new Dictionary<string, int>(); 

myDictionary.Add("First", 1); 
myDictionary.Add("Second", 2); 
myDictionary.Add("Third", 3); 

dynamic dynamicDictionary = myDictionary; 

foreach (var entry in dynamicDictionary) 
{ 
    object key = entry.Key; 
    object val = entry.Value; 
    ...whatever... 
} 
+1

コンパイル時に型が分からないので、型システムを迂回することなくこの問題を解決する方法はありません。どんな解決策にも「ダイナミック」やリフレクションのようなものが関与しており、2つの「ダイナミック」ははるかにエレガントです。 –

+0

質問にはより良い答えがあります - "あなたのソリューションを再設計するだけですか?"あなたの解決策を示すために気をつけますか?彼の問題が正確にどのように知っていますか?私はそのタイプの答えが嫌いです。 –

+1

あなたは状況を考えることができませんが、OPはその状況に達しました... –

0

私を助けてくれる私と一緒に。それは当時の私のニーズに合っていた...多分それは他の誰かを助けるだろう。

foreach (var unknown in (dynamic)savedState) 
{ 
    object dKey = unknown.Key; 
    object dValue = unknown.Value; 

    switch (dKey.GetType().ToString()) 
    { 
    case "System.String": 
     //Save the key 
     sKey = (string)dKey; 

     switch (dValue.GetType().ToString()) 
     { 
     case "System.String": 
      //Save the string value 
      sValue = (string)dValue; 

      break; 
     case "System.Int32": 
      //Save the int value 
      sValue = ((int)dValue).ToString(); 

      break; 
     } 

     break; 
    } 

    //Show the keypair to the global dictionary 
    MessageBox.Show("Key:" + sKey + " Value:" + sValue); 
} 
関連する問題

 関連する問題