Подтвердить что ты не робот

Определить, является ли свойство видом массива отражением

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

Пример:

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

Ответ 1

Кажется, вы задаете два разных вопроса: является ли тип массивом (например, 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 из этого метода.

Ответ 2

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

public bool IsPropertyACollection(this PropertyInfo property)
{
    return (!typeof(String).Equals(property.PropertyType) && 
        typeof(IEnumerable).IsAssignableFrom(property.PropertyType));
}

Ответ 3

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

property.PropertyType.IsArray;

изменить

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

return property.PropertyType.GetInterface("IEnumerable") != null;

Ответ 4

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

Ответ 5

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

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