开发者

Converting a KeyValuePair collection in to anonymous type

Is it possible to convert a a IEnumerable<KeyValuePair<string,string>> of KeyValuePair to an anonymous type?

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

The reason i would like to do this is because I am retrieving an object from a webservice that represents an object that does not exist in the wsdl. The returned object only contains a KeyValuePair collection that contains the custom fields and their values. These custom fields can be named anything, so i cant really map an xml deserialization method to the final object i will be using (whose properties must be bound to a grid).

*Just because I used Dictionary<string,string> does not mean 开发者_运维百科it is absolutely a dictionary, i just used it for illustration. Really its an IEnumerable<KeyValuePair<string,string>>

Ive been trying to thing of a way to do this, but am drawing a blank. This is c# .NET 4.0.


You could use the ExpandoObject, it is based on a dictionary.


I think there are a lot of ways to achieve this, but actually converting it in the same Dictionary seems a bit odd to do.

One way to accomplish this, by not actually converting everyting is the following:

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


ExpandoObject is the best option, which I believe is a wrapper around some XML. You could also use an 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);

I haven't used ExpandoObject, so I'd try that first because I understand it does exactly what you want and is also something new and interesting to learn.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜