Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to know if a PropertyInfo is a collection

Tags:

c#

reflection

Below is some code I use to get the initial state of all public properties in a class for IsDirty checking.

What's the easiest way to see if a property is IEnumerable?

Cheers,
Berryl

  protected virtual Dictionary<string, object> _GetPropertyValues()     {         return _getPublicPropertiesWithSetters()             .ToDictionary(pi => pi.Name, pi => pi.GetValue(this, null));     }      private IEnumerable<PropertyInfo> _getPublicPropertiesWithSetters()     {         return GetType().GetProperties().Where(pi => pi.CanWrite);     } 

UPDATE

What I wound up doing was adding a few library extensions as follows

    public static bool IsNonStringEnumerable(this PropertyInfo pi) {         return pi != null && pi.PropertyType.IsNonStringEnumerable();     }      public static bool IsNonStringEnumerable(this object instance) {         return instance != null && instance.GetType().IsNonStringEnumerable();     }      public static bool IsNonStringEnumerable(this Type type) {         if (type == null || type == typeof(string))             return false;         return typeof(IEnumerable).IsAssignableFrom(type);     } 
like image 595
Berryl Avatar asked Aug 25 '10 20:08

Berryl


2 Answers

if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType) && prop.PropertyType != typeof(string)) 
like image 179
Fyodor Soikin Avatar answered Sep 20 '22 10:09

Fyodor Soikin


I agree with Fyodor Soikin but the fact that is Enumerable does not mean that is only a Collection since string is also Enumerable and returns the characters one by one...

So i suggest using

if (typeof(ICollection<>).IsAssignableFrom(pi.PropertyType)) 
like image 44
sstauross Avatar answered Sep 20 '22 10:09

sstauross