Berryl Berryl - 2 months ago 34
C# Question

How to know if a PropertyInfo is a collection

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?



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);


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);

if ( typeof( IEnumerable ).IsAssignableFrom( pi.PropertyType ) )