2008-10-24 9 views
13

Comment obtenir le type d'une classe typée générique dans la classe?.NET: Comment vérifier le type dans une classe typée générique?

Un exemple:

je construis une collection typée générique mise en œuvre ICollection < T>. Au sein J'ai des méthodes telles que

public void Add(T item){ 
     ... 
    } 

    public void Add(IEnumerable<T> enumItems){ 
     ... 
    } 

Comment puis-je demander à l'intérieur de la méthode pour le type donné T?

La raison de ma question est: Si objet est utilisé comme T la collection utilise Ajouter (point d'objet) au lieu de Ajouter (IEnumerable objet <> enumItems) même si le paramètre est IEnumerable. Ainsi, dans le premier cas, il ajouterait toute la collection énumérable en tant qu'objet au lieu de plusieurs objets de la collection énumérable.

donc je besoin de quelque chose comme

if (T is object) { 
    // Check for IEnumerable 
} 

mais bien sûr, qui ne peuvent pas travailler en C#. Suggestions?

Merci beaucoup!

Michael

Répondre

21

Personnellement, je l'étape côté la question en renommant la méthode IEnumerable<T> à AddRange. Cela évite de tels problèmes et est cohérent avec les API existantes telles que List<T>.AddRange.

Il garde également les choses propres lorsque le T que vous souhaitez ajouter implémente IEnumerable<T> (rare, je vais l'admettre).

29

Vous pouvez utiliser: typeof(T)

if (typeof(T) == typeof(object)) { 
    // Check for IEnumerable 
} 
+2

Cela répond à la question posée dans le titre. – reads0520

-1

Si vous voulez utiliser l'opérateur is dans une classe générique/méthode que vous devez limiter T à un type de référence:

public void MyMethod<T>(T theItem) where T : class 
{ 
    if (theItem is IEnumerable) { DoStuff(); } 
} 
+0

Je pense qu'il est juste concerné quand un IEnumerable non générique est passé en tant que System.Object quand T est System.Object –

+0

marxidad, oui, c'est vrai. – Mil

Questions connexes