2011-01-13 3 views
0

Возможно ли преобразование a KeyValuePair в анонимный тип?Преобразование коллекции 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. Возвращаемый объект содержит только коллекцию KeyValuePair, содержащую настраиваемые поля и их значения. Эти настраиваемые поля можно назвать чем угодно, поэтому я не могу на самом деле сопоставить метод десериализации xml с конечным объектом, который я буду использовать (свойства которого должны быть привязаны к сетке).

* Просто потому, что я использовал Dictionary<string,string>, не означает, что это абсолютно словарь, я просто использовал его для иллюстрации. Действительно его a IEnumerable<KeyValuePair<string,string>>

Ive пытался что-то сделать, но я рисую пробел. Это C# .NET 4.0.

+0

Вы хотите динамическую типизацию, а не анонимный тип. Поэтому вы должны изучить функцию 'dynamic' C# 4. – CodesInChaos

+2

Вы говорите: (а) вы не знаете, что «первая» или «вторая» действительно будет там, они могут быть чем угодно, но (b) вы хотите иметь возможность кодировать «anonType.first» и «anonType» .second'? –

ответ

6

Вы можете использовать ExpandoObject, он основан на словаре.

+0

Используется динамическая типизация. Анонимные типы - это нечто иное. – CodesInChaos

+0

@CodeInChaos OP хочет иметь возможность писать 'anonType.first',' anonType.second'. Это выглядит как динамический объект, а не анонимный. –

+0

Хм, ты прав. Неправильная терминология отбросила меня. На самом деле выглядит так, как будто он хочет динамического ввода. – CodesInChaos

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, поэтому я хотел бы попробовать, что первый, потому что я понимаю, что это делает именно то, что вы хотите, и это тоже что-то новое и интересное, чтобы узнать.