Перечисление через свойства объекта (строку) в C # - PullRequest
41 голосов
/ 19 сентября 2009

Допустим, у меня много объектов, и у них много строковых свойств.

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

Может ли быть LINQ-способ запросить свойства объекта типа 'string' и вывести их?

Вам нужно жестко закодировать имена свойств, которые вы хотите отобразить?

Ответы [ 5 ]

77 голосов
/ 19 сентября 2009

Используйте отражение. Это далеко не так быстро, как жестко закодированный доступ к собственности, но он делает то, что вы хотите.

Следующий запрос генерирует анонимный тип со свойствами «Имя» и «Значение» для каждого строкового свойства в объекте «myObject»:

var stringPropertyNamesAndValues = myObject.GetType()
    .GetProperties()
    .Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null)
    .Select(pi => new 
    {
        Name = pi.Name,
        Value = pi.GetGetMethod().Invoke(myObject, null)
    });

Использование:

foreach (var pair in stringPropertyNamesAndValues)
{
    Console.WriteLine("Name: {0}", pair.Name);
    Console.WriteLine("Value: {0}", pair.Value);
}
13 голосов
/ 13 декабря 2010

Вы можете получить все свойства типа, используя метод GetProperties. Затем вы можете отфильтровать этот список, используя метод расширения LINQ Where. Наконец, вы можете проецировать свойства, используя метод расширения LINQ Select или удобный ярлык, например ToDictionary.

Если вы хотите ограничить перечисление свойствами, имеющими тип String, вы можете использовать этот код:

IDictionary<String, String> dictionary = myObject.GetType()
  .GetProperties()
  .Where(p => p.CanRead && p.PropertyType == typeof(String))
  .ToDictionary(p => p.Name, p => (String) p.GetValue(myObject, null));

Это создаст словарь, который отображает имена свойств в значения свойств. Поскольку тип свойства ограничен String, можно безопасно привести значение свойства к String, а тип возвращаемого типа - IDictionary<String, String>.

Если вместо этого вам нужны все свойства, вы можете сделать это следующим образом:

IDictionary<String, Object> dictionary = myObject.GetType()
  .GetProperties()
  .Where(p => p.CanRead)
  .ToDictionary(p => p.Name, p => p.GetValue(myObject, null));
3 голосов
/ 28 декабря 2012

Если ваша цель - просто вывести данные, хранящиеся в свойствах объекта, в удобочитаемом формате, я предпочитаю просто сериализовать объект в формат JSON.

using System.Web.Script.Serialization;
//...

string output = new JavaScriptSerializer().Serialize(myObject);
3 голосов
/ 19 сентября 2009

Вы можете использовать отражение, чтобы сделать это .... есть достойная статья на CodeGuru , но это может быть больше, чем вы ищете ... вы можете извлечь из него уроки, а затем адаптировать его к вашим потребностям.

0 голосов
/ 19 сентября 2009

Как насчет этого?

public string Prop1
{
    get { return dic["Prop1"]; }
    set { dic["Prop1"] = value; }
}

public string Prop2
{
    get { return dic["Prop2"]; }
    set { dic["Prop2"] = value; }
}

private Dictionary<string, string> dic = new Dictionary<string, string>();
public IEnumerable<KeyValuePair<string, string>> AllProps
{
    get { return dic.GetEnumerator(); }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...