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?
First way to print all properties of person object is by using Object. keys() method. In this method we pass the person object to Object. keys() as an argument.
The Object.assign() method copies all enumerable own properties from one or more source objects to a target object. It returns the modified target object.
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.
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();
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/
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,
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));
}
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With