40 votes

Déterminer si une propriété est une sorte de tableau par réflexion

Comment puis-je déterminer si une propriété est une sorte de tableau.

Exemple :

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

22voto

FSX Points 6786

Excluant la catégorie String car elle peut être considérée comme une collection parce qu'elle met en œuvre IEnumerable<char>.

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

17voto

Falanwe Points 2366

Si vous voulez savoir si la propriété est un tableau, c'est en fait très facile :

property.PropertyType.IsArray;

modifier

Si vous voulez savoir si c'est un type qui implémente IEnumerable, comme le font tous les « types de collection », ce n'est pas très compliqué non plus :

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

2voto

gabnaim Points 1067
    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;
    }

0voto

Pour moi, ce qui suit ne fonctionne pas,

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

Suivi fonctionnait,

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

C'est un raccourci pour vérifier ICollection<IInterface>ouICollection<BaseClassInTree>

var property = request as PropertyInfo;

property.PropertyType.IsGenericType && (typeof(ICollection<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition())) && typeof().IsAssignableFrom(property.PropertyType.GenericTypeArguments[0])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X