48

i have object like this:

some_object

this object has like 1000 properties.

i would like to loop through every property like this:

foreach (property in some_object)
//output the property

is there an easy way to do this?

abatishchev
  • 98,240
  • 88
  • 296
  • 433
Alex Gordon
  • 57,446
  • 287
  • 670
  • 1,062

6 Answers6

76

You can use reflection.

// 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();
}

However, this still does not solve the problem where you have an object with 1000 properties.

Chris Trombley
  • 2,232
  • 1
  • 17
  • 24
29

Another approach you can use in this situation is converting an object into a JSON object. The JSON.NET library makes this easy and almost any object can be represented in JSON. You can then loop through the objects properties as Name / Value pairs. This approach would be useful for composite objects which contain other objects as you can loop through them in a tree-like nature.

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();
bluish
  • 26,356
  • 27
  • 122
  • 180
Despertar
  • 21,627
  • 11
  • 81
  • 79
  • This is a fantastic and simple solution. Takes care of all the sub-objects automatically without having to worry about recursion or grabbing all the properties yourself. – mppowe Jul 24 '14 at 19:12
8
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);
}

Source: http://www.csharp-examples.net/reflection-property-names/

Brandon Boone
  • 16,281
  • 4
  • 73
  • 100
2

better version for deep search props also in basetypes

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));
}
D. Herzog
  • 66
  • 1
  • 3
2

You want one of the following, choose which works best for you:

Reflection: http://msdn.microsoft.com/en-us/library/136wx94f.aspx

Dynamic type: http://msdn.microsoft.com/en-us/library/dd264741.aspx

though as someone already pointed out, a class with 1000 properties is a code smell. You probably want a dictionary or collection instead,

Neil N
  • 24,862
  • 16
  • 85
  • 145
1

You use reflection.

There's even an article that describes how to do what you want:-

http://geekswithblogs.net/shahed/archive/2006/11/19/97548.aspx

Tim Almond
  • 12,088
  • 10
  • 40
  • 50