2011-01-13 106 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 2011-01-13 21:52:25

+2

你說的(a)你不知道「第一」或「第二」真的會在那裏,他們可能是任何東西,但(b)你想能夠編寫`anonType.first`和`anonType .second`? – 2011-01-13 21:53:42

回答

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

,所以我想嘗試,首先因爲我明白這不正是你想要什麼,也是一些新的和有趣的學習。

相關問題