Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loop over values in an IEnumerable<> using reflection

Given an object possibly containing an IEnumerable<T>, how would I check that an IEnumerable<T> property exists, and if it does, loop over all values in that IEnumerable<T> using reflection, for any T?

like image 898
Trev Avatar asked Sep 26 '12 18:09

Trev


2 Answers

foreach (var property in yourObject.GetType().GetProperties()) {     if (property.PropertyType.GetInterfaces().Contains(typeof(IEnumerable)))     {         foreach (var item in (IEnumerable)property.GetValue(yourObject, null))         {              //do stuff         }     } } 
like image 138
Phillip Schmidt Avatar answered Sep 22 '22 18:09

Phillip Schmidt


Well, you can test it as Aghilas said and, once tested and confirmed as IEnumerable you can do something like this:

public static bool IsEnumerable( object myProperty ) {     if( typeof(IEnumerable).IsAssignableFrom(myProperty .GetType())         || typeof(IEnumerable<>).IsAssignableFrom(myProperty .GetType()))         return true;      return false; }  public static string Iterate( object myProperty ) {     var ie = myProperty as IEnumerable;     string s = string.Empty;     if (ie != null)     {         bool first = true;         foreach( var p in ie )         {             if( !first )                 s += ", ";             s += p.ToString();             first = false;         }     }     return s; }  foreach( var p in myObject.GetType().GetProperties() ) {     var myProperty = p.GetValue( myObject );     if( IsEnumerable( myProperty ) )     {         Iterate( myProperty );     } } 
like image 38
VoidMain Avatar answered Sep 18 '22 18:09

VoidMain