86 votes

Comment vérifier si un 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 de caractères sans paramétrer expectedType à typeof(string[]) ? Je veux faire quelque chose comme :

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

Est-ce possible ?

139voto

Stefan Points 8183

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())
{
 ...
}

Attention à la Type.IsAssignableFrom() . Si vous voulez 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 devriez utiliser Type.IsAssignableFrom() :

typeof(BaseClass).IsAssignableFrom(typeof(ExpectedSubclass))

18voto

Aliostad Points 47792

Vous pouvez utiliser méthodes d'extension (non pas que vous soyez obligé, mais cela permet plus lisible ) :

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

Et ensuite utiliser :

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

7voto

xanatos Points 30513
value.GetType().GetElementType() == typeof(string)

en prime (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 chercher List, IEnumerable... et obtenir le T.

7voto

Natxo Points 1383

Le moyen le plus sûr et le plus efficace de le faire est d'utiliser la méthode suivante MakeArrayType :

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

0voto

Hakan KÜÇÜK Points 11

Voici un autre échantillon,

using System;
using System.Collections.Generic;

public static class Program
{
    public static void Main()
    {
        Type type = typeof(string[]);
        // string[], int[], char[], List<MyData>, IList<MyData>, IEnumarable<MyData>  =====> console write "True",
        // string, int, MyData etc ==== does not write 

        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IList<>))
        {
            Type itemType = type.GetGenericArguments()[0];
            Console.WriteLine("True");
        }

        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
        {
            Type itemType = type.GetGenericArguments()[0];
            Console.WriteLine("True");
        }

        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
        {
            Type itemType = type.GetGenericArguments()[0];
            Console.WriteLine("True");
        }

        if (type.IsArray)
        {
            Console.WriteLine("True");
        }       
    }
}

public class MyData
{
    public string Name { get; set; }
}

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