2011-01-13 5 views
0

Ist es möglich, eine von KeyValuePair in einen anonymen Typ umzuwandeln?Umwandlung einer KeyValuePair-Sammlung in einen anonymen Typ

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 

Der Grund Ich mag würde, dies zu tun ist, weil ich ein Objekt aus einem Webservice bin abgerufen werden, um ein Objekt darstellt, die in der WSDL-Datei nicht existiert. Das zurückgegebene Objekt enthält nur eine KeyValuePair-Auflistung, die die benutzerdefinierten Felder und ihre Werte enthält. Diese benutzerdefinierten Felder können beliebig benannt werden. Daher kann ich keine XML-Deserialisierungsmethode dem endgültigen Objekt zuordnen, das ich verwenden möchte (dessen Eigenschaften müssen an ein Raster gebunden sein).

* Nur weil ich Dictionary<string,string> verwendet habe, bedeutet das nicht, dass es absolut ein Wörterbuch ist, ich habe es nur zur Illustration verwendet. Wirklich ist es ein IEnumerable<KeyValuePair<string,string>>

Ich habe versucht, eine Sache zu tun, dies zu tun, aber zeichne ein Leerzeichen. Das ist C# .NET 4.0.

+0

Sie möchten dynamisches Schreiben, kein anonymer Typ. Also sollten Sie sich die dynamische Funktion von C# 4 ansehen. – CodesInChaos

+2

Du sagst (a) du weißt nicht, dass "first" oder "second" wirklich da sein werden, sie könnten alles sein, aber (b) du willst "anonType.first" und "anonType" codieren können .zweite'? –

Antwort

6

Sie könnten das ExpandoObject verwenden, es basiert auf einem Wörterbuch.

+0

Das verwendet dynamische Typisierung. Anonyme Typen sind etwas anderes. – CodesInChaos

+0

@CodeInChaos Das OP möchte in der Lage sein, 'anonType.first',' anonType.second' zu schreiben. Dies sieht wie ein dynamisches Objekt aus, kein anonymer. –

+0

hmm, du hast Recht. Die falsche Terminologie hat mich abgewimmelt. Sieht wirklich so aus, als ob er dynamisches Tippen möchte. – CodesInChaos

0

Ich denke, es gibt eine Menge Möglichkeiten, dies zu erreichen, aber es tatsächlich ein bisschen seltsam zu machen, es in das gleiche Wörterbuch zu konvertieren.

Eine Möglichkeit, dies zu erreichen, indem sie nicht tatsächlich every Umwandlung ist die folgende:

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 ist die beste Option, die ich glaube, ein Wrapper um einige XML. Sie könnten auch eine XElement verwenden:

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

ich nicht ExpandoObject verwendet haben, so würde ich versuchen, dass zuerst, weil ich verstehe, es tut genau das, was Sie wollen und ist auch etwas Neues und Interessantes zu lernen.

Verwandte Themen