С# получает ВСЕ свойства объекта

У меня есть объект вроде этого:

some_object

этот объект имеет 1000 свойств.

я хотел бы пропустить все свойства, подобные этому:

foreach (property in some_object)
//output the property

Есть простой способ сделать это?

Ответ 1

Вы можете использовать отражение.

// Get property array
var properties = GetProperties(some_object);

foreach (var p in properties)
{
    string name = p.Name;
    var value = p.GetValue(some_object, null);
}

private static PropertyInfo[] GetProperties(object obj)
{
    return obj.GetType().GetProperties();
}

Однако это еще не решает проблему, когда у вас есть объект с 1000 свойствами.

Ответ 2

Другой подход, который вы можете использовать в этой ситуации, - это преобразование объекта в объект JSON. Библиотека JSON.NET позволяет легко и практически любой объект быть представлен в JSON. Затем вы можете прокручивать свойства объектов как пары Name/Value. Этот подход был бы полезен для составных объектов, которые содержат другие объекты, поскольку вы можете прокручивать их по древовидной природе.

MyClass some_object = new MyClass() { PropA = "A", PropB = "B", PropC = "C" };
JObject json = JObject.FromObject(some_object);
foreach (JProperty property in json.Properties())
    Console.WriteLine(property.Name + " - " + property.Value);

Console.ReadLine();

Ответ 3

using System.Reflection;  // reflection namespace

// get all public static properties of MyClass type
PropertyInfo[] propertyInfos;
propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public |
                                              BindingFlags.Static);
// sort properties by name
Array.Sort(propertyInfos,
        delegate(PropertyInfo propertyInfo1, PropertyInfo propertyInfo2)
        { return propertyInfo1.Name.CompareTo(propertyInfo2.Name); });

// write property names
foreach (PropertyInfo propertyInfo in propertyInfos)
{
  Console.WriteLine(propertyInfo.Name);
}

Источник: http://www.csharp-examples.net/reflection-property-names/

Ответ 4

Вы хотите одно из следующего: выберите, который лучше всего подходит для вас:

Отражение: http://msdn.microsoft.com/en-us/library/136wx94f.aspx

Динамический тип: http://msdn.microsoft.com/en-us/library/dd264741.aspx

хотя, как уже указывалось, класс с 1000 свойствами является запахом кода. Вероятно, вам нужен словарь или коллекция,

Ответ 6

лучшая версия для глубоких поисковых реквизитов также в банетах

public static IEnumerable<PropertyInfo> GetAllProperties(Type t)
{
  if (t == null)
    return Enumerable.Empty<PropertyInfo>();

  BindingFlags flags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly;
    return t.GetProperties(flags).Union(GetAllProperties(t.BaseType));
}