2009-03-12 5 views
9

Je dois valider un objet pour voir s'il est nul, un type de valeur ou IEnumerable<T>T est un type de valeur. Jusqu'à présent, j'ai:Comment puis-je savoir si le type d'un objet est une sous-classe de IEnumerable <T> pour n'importe quel type de valeur T?

if ((obj == null) || 
    (obj .GetType().IsValueType)) 
{ 
    valid = true; 
} 
else if (obj.GetType().IsSubclassOf(typeof(IEnumerable<>))) 
{ 
    // TODO: check whether the generic parameter is a value type. 
} 

J'ai trouvé que l'objet est nul, un type de valeur, ou IEnumerable<T> pour certains T; comment puis-je vérifier si ce T est un type de valeur?

Répondre

12

(modifier - bits de type valeur ajoutée)

Vous devez vérifier toutes les interfaces qu'il implémente (notez qu'il pourrait en théorie mettre en œuvre IEnumerable<T> pour plusieurs T):

foreach (Type interfaceType in obj.GetType().GetInterfaces()) 
{ 
    if (interfaceType.IsGenericType 
     && interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) 
    { 
     Type itemType = interfaceType.GetGenericArguments()[0]; 
     if(!itemType.IsValueType) continue; 
     Console.WriteLine("IEnumerable-of-" + itemType.FullName); 
    } 
} 
+1

est-GetInterfaces suffisamment récursive pour vous dire ne pas besoin de vous inquiéter d'aller le parent les types? –

+0

@Jon: Je le pense, oui. –

+1

Vous n'avez pas besoin de récursivité. Une classe implémente une interface, ou ce n'est pas le cas. C'est une liste plate, indépendamment de la façon dont les interfaces elles-mêmes "héritent" les unes des autres. – Tar

0

Pouvez-vous faire quelque chose avec GetGenericArguments?

0

Ma contribution générique qui vérifie si un type donné (ou ses classes de base) met en œuvre une interface de type T:

public static bool ImplementsInterface(this Type type, Type interfaceType) 
{ 
    while (type != null && type != typeof(object)) 
    { 
     if (type.GetInterfaces().Any(@interface => 
      @interface.IsGenericType 
      && @interface.GetGenericTypeDefinition() == interfaceType)) 
     { 
      return true; 
     } 

     type = type.BaseType; 
    } 

    return false; 
} 
Questions connexes