75 votes

Comment puis-je obtenir le Tableau et le Type d'Élément de Type Tableau dans .net

Dire que j'ai un System.String[] type d'objet. Je peux interroger le type de l'objet pour déterminer si c'est un tableau

Type t1 = typeof(System.String[]);
bool isAnArray = t1.IsArray; // should be true

Cependant comment puis-je obtenir un objet de type de l'élément de tableau de t1

Type t2 = ....; // should be typeof(System.String)

123voto

Ani Points 59747

Vous pouvez utiliser la méthode d'instance Type.GetElementType pour ce but.

Type t2 = t1.GetElementType();

[Revient] le type de l'objet englobait ou visé par l'actuel tableau, pointeur ou d'une référence de type, ou null si le Type n'est pas un tableau ou un pointeur, ou n'est pas passé par référence, ou représente un type générique ou un paramètre de type dans la définition d'un type générique ou méthode générique.

13voto

drzaus Points 3344

Grâce à @psaxton commentaire en soulignant la différence entre le Tableau et d'autres collections. Comme une extension de la méthode:

public static class TypeHelperExtensions
{
    /// <summary>
    /// If the given <paramref name="type"/> is an array or some other collection
    /// comprised of 0 or more instances of a "subtype", get that type
    /// </summary>
    /// <param name="type">the source type</param>
    /// <returns></returns>
    public static Type GetEnumeratedType(this Type type)
    {
        // provided by Array
        var elType = type.GetElementType();
        if (null != elType) return elType;

        // otherwise provided by collection
        var elTypes = type.GetGenericArguments();
        if (elTypes.Length > 0) return elTypes[0];

        // otherwise is not an 'enumerated' type
        return null;
    }
}

Utilisation:

typeof(Foo).GetEnumeratedType(); // null
typeof(Foo[]).GetEnumeratedType(); // Foo
typeof(List<Foo>).GetEnumeratedType(); // Foo
typeof(ICollection<Foo>).GetEnumeratedType(); // Foo
typeof(IEnumerable<Foo>).GetEnumeratedType(); // Foo

// some other oddities
typeof(HashSet<Foo>).GetEnumeratedType(); // Foo
typeof(Queue<Foo>).GetEnumeratedType(); // Foo
typeof(Stack<Foo>).GetEnumeratedType(); // Foo
typeof(Dictionary<int, Foo>).GetEnumeratedType(); // int
typeof(Dictionary<Foo, int>).GetEnumeratedType(); // Foo, seems to work against key

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