2011-01-13 85 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

,所以我想尝试,首先因为我明白这不正是你想要什么,也是一些新的和有趣的学习。