Преобразование динамического типа в словарь С#

У меня есть динамический объект, который выглядит так:

 {
    "2" : "foo",
    "5" : "bar",
    "8" : "foobar"
 }

Как я могу преобразовать это в dictionary?

Ответ 1

Вы можете использовать RouteValueDictionary для преобразования объекта С# в словарь. См. Класс RouteValueDictionary - MSDN. Он преобразует свойства object в пары ключ-значение.

Используйте его так:

var toBeConverted = new {
    foo = 2,
    bar = 5,
    foobar = 8
};

var result = new RouteValueDictionary(toBeConverted);

Ответ 2

Если указанное динамическое значение было создано путем десериализации из Json.Net, как вы упомянули в своих комментариях, тогда это должно быть JObject. Оказывается, что JObject уже реализует IDictionary<string, JToken>, поэтому вы можете использовать его в качестве словаря без преобразования, как показано ниже:

string json = 
     @"{ ""blah"" : { ""2"" : ""foo"", ""5"" : ""bar"", ""8"" : ""foobar"" } }";

var dict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
dynamic dyn = dict["blah"];

Console.WriteLine(dyn.GetType().FullName);     // Newtonsoft.Json.Linq.JObject
Console.WriteLine(dyn["2"].ToString());        // foo

Если вы предпочитаете использовать Dictionary<string, string>, вы можете преобразовать его следующим образом:

Dictionary<string, string> newDict = 
          ((IEnumerable<KeyValuePair<string, JToken>>)dyn)
                     .ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString());

Ответ 3

Вы можете заполнить словарь, используя отражение:

public Dictionary<String, Object> Dyn2Dict(dynamic dynObj)
{
     var dictionary = new Dictionary<string, object>();
     foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(dynObj))
     {
        object obj = propertyDescriptor.GetValue(dynObj);
        dictionary.Add(propertyDescriptor.Name, obj);
     }
     return dictionary;
}

Ответ 4

Вы можете использовать Json.Net, чтобы десериализовать его в словаре.

string json = dynamicObject.ToString(); // suppose `dynamicObject` is your input
Dictionary<string, string> dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

Ответ 6

Вы можете сделать это с помощью jsonSerializer. И для этого требуется ссылка System.Net.Extensions. Вот пример кода.

var jss = new JavaScriptSerializer();
var dict = jss.Deserialize<Dictionary<string,string>>(jsonText);
var place = dict["8"]; // "foobar"

Ответ 7

Очень похоже на ema answer, но с однострочным использованием LINQ magic:

Dictionary<string, object> myDict = sourceObject.GetType().GetProperties().ToDictionary(prop => prop.Name, prop => prop.GetValue(sourceObject, null));