Как узнать, является ли PropertyInfo коллекцией - PullRequest
49 голосов
/ 26 августа 2010

Ниже приведен код, который я использую для получения начального состояния всех открытых свойств в классе для проверки IsDirty.

Какой самый простой способ узнать, является ли свойство IEnumerable?

Приветствия
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

Я закончил тем, что добавил несколько расширений библиотеки следующим образом

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

Ответы [ 3 ]

57 голосов
/ 26 августа 2010
if ( typeof( IEnumerable ).IsAssignableFrom( pi.PropertyType ) )
12 голосов
/ 15 марта 2013

Я согласен с Федором Сойкиным, но тот факт, что Enumerable является Enumerable, не означает, что он является только Collection, поскольку строка также Enumerable и возвращает символы один за другим ...

Поэтому я предлагаю использовать

if (typeof(ICollection<>).IsAssignableFrom(pi.PropertyType))
3 голосов
/ 26 августа 2010

Попробуйте

private bool IsEnumerable(PropertyInfo pi)
{
   return pi.PropertyType.IsSubclassOf(typeof(IEnumerable));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...