Перечисление через свойства объекта (строка) в С#
Скажем, у меня много объектов, и у них много строковых свойств.
Есть ли программный способ пройти через них и вывести имя свойства и его значение или он должен быть жестко закодирован?
Есть ли способ LINQ для запроса свойств объекта типа 'string' и для вывода их?
Вам нужно жестко закодировать имена свойств, которые вы хотите эхо?
Ответы
Ответ 1
Используйте отражение. Это не так быстро, как доступ к жесткому кодированию, но он делает то, что вы хотите.
Следующий запрос генерирует анонимный тип с свойствами Name и Value для каждого свойства, типизируемого строкой, в объекте '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);
}
Ответ 2
Вы можете получить все свойства типа с помощью метода GetProperties
. Затем вы можете отфильтровать этот список, используя метод расширения LINQ Where
. Наконец, вы можете проецировать свойства, используя метод расширения LINQ Select
или удобный ярлык, например ToDictionary
.
Если вы хотите ограничить перечисление свойствами, имеющими тип String
, вы можете использовать этот код:
IDictionary<String, String> = 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> = myObject.GetType()
.GetProperties()
.Where(p => p.CanRead)
.ToDictionary(p => p.Name, p => p.GetValue(myObject, null));
Ответ 3
Вы можете использовать отражение, чтобы сделать это.... есть достойная статья на
CodeGuru, но это может быть больше, чем вы ищете... вы можете извлечь уроки из него, а затем подрезать его к вашим потребностям.
Ответ 4
Если ваша цель - просто выводить данные, хранящиеся в свойствах объекта, с помощью считываемого человеком формата, я предпочитаю просто сериализовать объект в формате JSON.
using System.Web.Script.Serialization;
//...
string output = new JavaScriptSerializer().Serialize(myObject);
Ответ 5
Как насчет чего-то подобного?
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(); }
}