Подтвердить что ты не робот

Как преобразовать класс в словарь <string, string>?

Теперь снова я объясняю одно из моего рвения о Словаре! Этот вопрос появляется в моем сознании из ответа на предыдущий вопрос

Теперь фактическая точка Можно ли преобразовать класс в словарь?

В словаре Я хочу, чтобы мои свойства класса KEY и значение определенного свойства как VALUE

Предположим, что мой класс

public class Location
{
    public string city { get; set; }
    public string state { get; set; }
    public string country { get; set;
}

Теперь предположим, что мои данные

city = Delhi
state = Delhi
country = India

Теперь вы можете легко понять мою точку зрения.

Я хочу сделать словарь! Этот словарь должен выглядеть как

Dictionary<string,string> dix = new Dictionary<string,string> ();
dix.add("property_name", "property_value");

Я могу получить значение! Но как я могу получить имена свойств (не значение)?

Что мне следует кодировать для создания динамического! Это должно работать для каждого класса, который я хочу?

Вы можете понять этот вопрос как

Как я могу получить список свойств из определенного класса?

4b9b3361

Ответ 1

Это рецепт: 1 отражение, 1 LINQ-to-Objects!

 someObject.GetType()
     .GetProperties(BindingFlags.Instance | BindingFlags.Public)
          .ToDictionary(prop => prop.Name, prop => prop.GetValue(someObject, null))

Поскольку я опубликовал этот ответ, я проверил, что многие люди считают его полезным. Я приглашаю всех искать это простое решение для проверки другого Q & A, где я обобщил его на метод расширения: Сопоставление объекта со словарем и наоборот.

Ответ 2

Вот пример с отражением без linq:

    Location local = new Location();
    local.city = "Lisbon";
    local.country = "Portugal";
    local.state = "None";

    PropertyInfo[] infos = local.GetType().GetProperties();

    Dictionary<string,string> dix = new Dictionary<string,string> ();

    foreach (PropertyInfo info in infos)
    {
        dix.Add(info.Name, info.GetValue(local, null).ToString());
    }

    foreach (string key in dix.Keys)
    {
        Console.WriteLine("nameProperty: {0}; value: {1}", key, dix[key]);
    }

    Console.Read();

Ответ 3

protected string getExamTimeBlock(object dataItem)
{
    var dt = ((System.Collections.Specialized.StringDictionary)(dataItem));

    if (SPContext.Current.Web.CurrencyLocaleID == 1033) return dt["en"];
    else return dt["sv"];
}

Ответ 4

Попробуйте.

    public static Dictionary<string, object> ObjectToDictionary(object obj)
    {
        Dictionary<string, object> ret = new Dictionary<string, object>();

        foreach (PropertyInfo prop in obj.GetType().GetProperties())
        {
            string propName = prop.Name;
            var val = obj.GetType().GetProperty(propName).GetValue(obj, null);
            if (val != null)
            {
                ret.Add(propName, val.ToString());
            }
            else
            {
                ret.Add(propName, null);
            }
        }

        return ret;
    }

Ответ 5

Я хотел бы добавить альтернативу отражению, используя JToken. Вам нужно будет проверить разницу между двумя, чтобы увидеть, какая из них имеет лучшую производительность.

var location = new Location() { City = "London" };
var locationToken = JToken.FromObject(location);
var locationObject = locationObject.Value<JObject>();
var locationPropertyList = locationObject.Properties()
    .Select(x => new KeyValuePair<string, string>(x.Name, x.Value.ToString()));

Обратите внимание, что этот метод лучше всего подходит для плоской структуры класса.