2011-01-13 6 views
0

KeyValuePairのIEnumerable<KeyValuePair<string,string>>を匿名型に変換することはできますか?KeyValuePairコレクションを匿名型に変換する

Dictionary<string, string> dict= new Dictionary<string, string>(); 
dict.add("first", "hello"); 
dict.add("second", "world"); 

var anonType = new{dict.Keys[0] = dict[0], dict.Keys[1] = dict[1]}; 

Console.WriteLine(anonType.first); 
Console.WriteLine(anonType.second); 

********************output***************** 
hello 
world 

私は、WSDLに存在しないオブジェクトを表しWebサービスからオブジェクトを取得していますので、私はこれをやりたい理由があります。返されるオブジェクトには、カスタムフィールドとその値を含むKeyValuePairコレクションのみが含まれます。これらのカスタムフィールドは何でも構いませんので、私は本当にXMLの逆シリアル化メソッドを最終的なオブジェクトにマッピングします(そのプロパティはグリッドにバインドされなければなりません)。

*ちょうど私がDictionary<string,string>を使用したからといって、それは絶対的な辞書という意味ではありません。本当にそのIEnumerable<KeyValuePair<string,string>>

私はこれを行う方法にしようとしましたが、空白を描いています。これはc#.NET 4.0です。

+0

匿名型ではなく、動的な型指定が必要です。だから、C#4の「動的」機能を調べるべきです。 – CodesInChaos

+2

あなたは、(a)「最初の」または「2番目の」が本当にそこにあるかどうかわからない、何かになる可能性がありますが、(b)anonType.firstおよびanonType秒? –

答えて

6

ExpandoObjectは、辞書に基づいています。

+0

これは動的な型指定を使用します。匿名の種類は異なるものです。 – CodesInChaos

+0

@CodeInChaos OPは、 'anonType.first'、' anonType.second'と書くことができます。これは、匿名のものではなく、動的なオブジェクトのように見えます。 –

+0

あなたは正しいです。間違った用語が私を捨てました。彼は動的なタイピングを望んでいるように見えます。 – CodesInChaos

0

私はこれを達成するための方法がたくさんあると思いますが、実際には同じディクショナリで変換するのはちょっと奇妙なようです。実際everytingを変換しないことによって、これを達成する

一つの方法は以下の通りです:

public class MyDictionary<T,K> : Dictionary<string,string> // T and K is your own type 
{ 
    public override bool TryGetValue(T key, out K value) 
    { 
     string theValue = null; 
     // magic conversion of T to a string here 
     base.TryGetValue(theConvertedOfjectOfTypeT, out theValue); 
     // Do some magic conversion here to make it a K, instead of a string here 
     return theConvertedObjectOfTypeK; 
    } 
} 
0

ExpandoObjectは、私はいくつかのXMLのラッパーであると考えて最良の選択肢です。あなたはまたのXElementを使用することができます。

var result = new XElement("root"); 
result.Add(new XElement("first", "hello")); 
result.Add(new XElement("second", "world")); 

Console.WriteLine(result.Element("first").Value); 
Console.WriteLine(result.Element("second").Value); 

foreach (var element in result.Elements()) 
    Console.WriteLine(element.Name + ": " + element.Value); 

私はExpandoObjectを使用していないので、私はそれが正確に何をしたい行い、また学ぶための新しい、面白いものであることを理解ので、私はそれが最初に試してみました。

関連する問題