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

Перечисление через свойства объекта (строка) в С#

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

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

Есть ли способ LINQ для запроса свойств объекта типа 'string' и для вывода их?

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

4b9b3361

Ответ 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(); }
}