Как преобразовать класс в словарь <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");
Я могу получить значение! Но как я могу получить имена свойств (не значение)?
Что мне следует кодировать для создания динамического! Это должно работать для каждого класса, который я хочу?
Вы можете понять этот вопрос как
Как я могу получить список свойств из определенного класса?
Ответы
Ответ 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()));
Обратите внимание, что этот метод лучше всего подходит для плоской структуры класса.