将KeyValuePair集合转换为匿名类型

时间:2011-01-13 21:38:31

标签: c# .net

是否可以将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

我想这样做的原因是因为我从web服务中检索一个对象,该对象表示wsdl中不存在的对象。返回的对象仅包含KeyValuePair集合,该集合包含自定义字段及其值。这些自定义字段可以命名为任何名称,因此我无法将xml反序列化方法映射到我将使用的最终对象(其属性必须绑定到网格)。

*仅仅因为我使用Dictionary<string,string>并不意味着它绝对是一本字典,我只是用它来说明。真的是IEnumerable<KeyValuePair<string,string>>

我一直试图想办法做到这一点,但我画了一个空白。这是c#.NET 4.0。

3 个答案:

答案 0 :(得分:6)

您可以使用ExpandoObject,它基于字典。

答案 1 :(得分:0)

我认为有很多方法可以实现这一点,但实际上在同一个词典中进行转换似乎有点奇怪。

实现这一目标的一种方法是,不实际转换每一种方法如下:

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;
    }
}

答案 2 :(得分: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,所以我先尝试一下,因为我知道它完全符合你的要求,也是一些新的有趣的东西。