web-dev-qa-db-fra.com

Comment vérifier si l'objet est un tableau d'un certain type?

Cela fonctionne bien:

var expectedType = typeof(string);
object value = "...";
if (value.GetType().IsAssignableFrom(expectedType))
{
     ...
}

Mais comment puis-je vérifier si la valeur est un tableau de chaînes sans définir expectedType sur typeof(string[])? Je veux faire quelque chose comme:

var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType().IsArrayOf(expectedType)) // <---
{
     ...
}

Est-ce possible?

59
Allrameest

Utilisez Type.IsArray et Type.GetElementType () pour vérifier le type d'élément d'un tableau.

Type valueType = value.GetType();
if (valueType.IsArray && expectedType.IsAssignableFrom(valueType.GetElementType())
{
 ...
}

Méfiez-vous des Type.IsAssignableFrom () . Si vous souhaitez vérifier le type pour une correspondance exacte, vous devez vérifier l'égalité (typeA == typeB). Si vous voulez vérifier si un type donné est le type lui-même ou une sous-classe (ou une interface), vous devez utiliser Type.IsAssignableFrom():

typeof(BaseClass).IsAssignableFrom(typeof(ExpectedSubclass))
102
Stefan

Vous pouvez utiliser méthodes d'extension (pas que vous devez le faire mais le rend plus lisible):

public static class TypeExtensions
{
    public static bool IsArrayOf<T>(this Type type)
    {
         return type == typeof (T[]);
    }
} 

Et puis utilisez:

Console.WriteLine(new string[0].GetType().IsArrayOf<string>());
15
Aliostad

La façon la plus ordonnée et la plus sûre de le faire qui a trouvé est d'utiliser MakeArrayType:

var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType() == expectedType.MakeArrayType())
{
     ...
}
6
Natxo
value.GetType().GetElementType() == typeof(string)

en bonus (mais je ne suis pas sûr à 100%. C'est le code que j'utilise ...)

var ienum = value.GetType().GetInterface("IEnumerable`1");

if (ienum != null) {
    var baseTypeForIEnum = ienum.GetGenericArguments()[0]
}

avec cela, vous pouvez rechercher List, IEnumerable ... et obtenir le T.

5
xanatos