Есть ли простой способ конвертировать свойства объекта в словарь <строка, строка> - PullRequest
29 голосов
/ 02 февраля 2012

У меня есть объект базы данных (строка), который имеет множество свойств (столбцов), которые сопоставляются с полями формы (asp: текстовое поле, asp: выпадающий список и т.д.) .Я хотел бы преобразовать этот объект и свойства в карту словаря, чтобы упростить итерацию.

Пример:

Dictionary<string, string> FD = new Dictionary<string,string>();
FD["name"] = data.name;
FD["age"] = data.age;
FD["occupation"] = data.occupation;
FD["email"] = data.email;
..........

Как бы это сделать легко, не вводя вручную всеразличные свойства 100?

Примечание: индексы словаря FD совпадают с именами столбцов базы данных.

Ответы [ 4 ]

62 голосов
/ 02 февраля 2012

Если предположить, что data - это какой-то объект и вы хотите поместить его общедоступные свойства в словарь, тогда вы можете попробовать:

Оригинал - здесь по историческим причинам (2012) :

Dictionary<string, string> FD = (from x in data.GetType().GetProperties() select x)
    .ToDictionary (x => x.Name, x => (x.GetGetMethod().Invoke (data, null) == null ? "" : x.GetGetMethod().Invoke (data, null).ToString()));

Обновлено (2017) :

Dictionary<string, string> dictionary = data.GetType().GetProperties()
    .ToDictionary(x => x.Name, x => x.GetValue(data)?.ToString() ?? "");
10 голосов
/ 02 февраля 2012

Класс HtmlHelper позволяет преобразовывать объект Anonymouns Object в RouteValueDictonary, и я предполагаю, что вы можете использовать .ToString () для каждого значения, чтобы получить представление строки:

 var linkAttributes = System.Web.Mvc.HtmlHelper.AnonymousObjectToHtmlAttributes(linkHtmlAttributes);

Недостатком является то, что это частьASP.NET MVC Framework.Используя .NET Reflector, код внутри метода выглядит следующим образом:

public static RouteValueDictionary AnonymousObjectToHtmlAttributes(object htmlAttributes)
{
   RouteValueDictionary dictionary = new RouteValueDictionary();
  if (htmlAttributes != null)
  {
     foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(htmlAttributes))
     {
            dictionary.Add(descriptor.Name.Replace('_', '-'), descriptor.GetValue(htmlAttributes));
       }
 }
    return dictionary;
 }

Вы увидите, что этот код идентичен ответу, который дал мне Яхья, а его ответ содержит Dictonary,С помощью отраженного кода, который я дал вам, вы можете легко конвертировать RouteValueDictionary в Dictonaryно ответ Яхии - это одна строка.

РЕДАКТИРОВАТЬ - я добавил код для того, что может быть методом для конвертации:

РЕДАКТИРОВАТЬ 2- Я добавил нулевую проверку в код и использовал String.Format для строкового значения

    public static Dictionary<string, string> ObjectToDictionary(object value)
    {
        Dictionary<string, string> dictionary = new Dictionary<string, string>();
        if (value != null)
        {
            foreach (System.ComponentModel.PropertyDescriptor descriptor in System.ComponentModel.TypeDescriptor.GetProperties(value))
            {
                if(descriptor != null && descriptor.Name != null)
                {
                     object propValue = descriptor.GetValue(value);
                     if(propValue != null)
                          dictionary.Add(descriptor.Name,String.Format("{0}",propValue));
            }
        }
        return dictionary;
    }

И чтобы перейти от словаря к проверке объекта http://automapper.org/, которая была предложенав этой теме Преобразовать словарь в анонимный объект

9 голосов
/ 02 февраля 2012
var myDict = myObj.ToDictionary(); //returns all public fields & properties

.

public static class MyExtensions
{
    public static Dictionary<string, object> ToDictionary(this object myObj)
    {
        return myObj.GetType()
            .GetProperties()
            .Select(pi => new { Name = pi.Name, Value = pi.GetValue(myObj, null) })
            .Union( 
                myObj.GetType()
                .GetFields()
                .Select(fi => new { Name = fi.Name, Value = fi.GetValue(myObj) })
             )
            .ToDictionary(ks => ks.Name, vs => vs.Value);
    }
}
0 голосов
/ 02 февраля 2012

Взгляните на System.ComponentModel.TypeDescriptor.GetProperties( ... ). Так работают обычные биты привязки данных. Он будет использовать отражение и вернет вам коллекцию дескрипторов свойств (которую вы можете использовать для получения значений). Вы можете настроить эти дескрипторы для производительности, реализовав ICustomTypeDescriptor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...