Определите, является ли свойство видом массива по отражению - PullRequest
37 голосов
/ 24 февраля 2012

Как определить, является ли свойство видом массива.

Пример:

public bool IsPropertyAnArray(PropertyInfo property)
{
    // return true if type is IList<T>, IEnumerable<T>, ObservableCollection<T>, etc...
}

Ответы [ 5 ]

66 голосов
/ 24 февраля 2012

Похоже, вы задаете два разных вопроса: является ли тип массивом (например, string[]) или любым типом коллекции.

Для первых просто отметьте property.PropertyType.IsArray.

Для последнего вы должны решить, каким минимальным критериям вы хотите, чтобы тип соответствовал. Например, вы можете проверить неуниверсальный IEnumerable, используя typeof(IEnumerable).IsAssignableFrom(property.PropertyType). Вы также можете использовать это для универсальных интерфейсов, если вы знаете фактический тип T, например, typeof(IEnumerable<int>).IsAssignableFrom(property.PropertyType).

Проверка универсального IEnumerable<T> или любого другого универсального интерфейса без знания значения T может быть выполнена путем проверки, если property.PropertyType.GetInterface(typeof(IEnumerable<>).FullName) не null. Обратите внимание, что в этом коде я не указал тип для T. Вы можете сделать то же самое для IList<T> или любого другого интересующего вас типа.

Например, вы можете использовать следующее, если хотите проверить общий IEnumerable<T>:

public bool IsPropertyACollection(PropertyInfo property) 
{ 
    return property.PropertyType.GetInterface(typeof(IEnumerable<>).FullName) != null;
} 

Массивы также реализуют IEnumerable, поэтому они также будут возвращать true из этого метода.

19 голосов
/ 29 мая 2014

Исключая класс String, поскольку он квалифицируется как коллекция, поскольку он реализует IEnumerable<char>.

public bool IsPropertyACollection(this PropertyInfo property)
{
    return (!typeof(String).Equals(property.PropertyType) && 
        typeof(IEnumerable).IsAssignableFrom(property.PropertyType));
}
15 голосов
/ 24 февраля 2012

Если вы хотите узнать, является ли свойство массивом, на самом деле это очень просто:

property.PropertyType.IsArray;

edit

Если вы хотите знать, является ли онотип, который реализует IEnumerable, как и все «типы коллекций», он тоже не очень сложен:

return property.PropertyType.GetInterface("IEnumerable") != null;
2 голосов
/ 22 октября 2013
    public static bool IsGenericEnumerable(Type type)
    {
        return type.IsGenericType && 
            type.GetInterfaces().Any(
            ti => (ti == typeof (IEnumerable<>) || ti.Name == "IEnumerable"));
    }

    public static bool IsEnumerable(Type type)
    {
        return IsGenericEnumerable(type) || type.IsArray;
    }
0 голосов
/ 20 марта 2014

Для меня следующее не работает,

return property.PropertyType.GetInterface(typeof(ICollection<>).FullName) != null;

Следующее работало,

typeof(ICollection<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition())

Это быстрый способ проверки ICollection<IInterface> или ICollection<BaseClassInTree>

var property = request as PropertyInfo;

property.PropertyType.IsGenericType && (typeof(ICollection<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition())) && typeof().IsAssignableFrom(property.PropertyType.GenericTypeArguments[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...