2009-02-11 6 views
11

Par réflexion, y a-t-il un moyen pour moi de regarder le type contenu d'une liste générique pour voir de quel type est la collection? Par exemple:Obtenir le type contenu dans une liste <T> par réflexion?

J'ai un simple ensemble d'objets métier qui dérivent d'une interface, comme ceci:

public interface IEntityBase{} 

public class BusinessEntity : IEntityBase 
{ 
    public IList<string> SomeStrings {get; set;}  
    public IList<ChildBusinessEntity> ChildEntities { get; set;} 
} 

public class ChildBusinessEntity : IEntityBase{} 

Dans le cas où j'Itère les propriétés de BusinessEntity par la réflexion, y aurait-il un moyen pour moi de voir si les objets imbriqués dans ces listes dérivées de IEntityBase?

Pseudo codé (mal) comme ceci:

foreach(PropertyInfo info in typeof(BusinessEntity).GetProperties()) 
{ 
    if(info.PropertyType is GenericIList && 
    TheNestedTypeInThisList.IsAssignableFrom(IEntityBase) 
    { 
    return true; 
    } 
} 

seule option que je l'ai entendu à ce jour, qui fonctionne, serait de retirer le premier élément de cette liste, puis regardez son type . Un moyen plus facile (surtout parce que je ne peux pas être garanti que la liste ne sera pas vide)?

+0

Dupe: http://stackoverflow.com/questions/528546/type-getinterface-and-nested-types –

+0

Pas dupe: cette question est poser des questions sur les types imbriqués, alors que celui-ci (malgré la title) semble s'interroger sur un type générique. – ChrisW

+0

Oups, vous avez raison, mon mauvais: P –

Répondre

27

En supposant que vous avez le System.Type qui décrit votre List<>, vous pouvez utiliser la méthode Type.GetGenericArguments() pour obtenir l'instance Type qui décrit ce qu'il est une liste de.

2

quelque chose comme ça?

foreach (System.Reflection.PropertyInfo info 
             in typeof(BusinessEntity).GetProperties()) 
{ 
    if (info.PropertyType.IsGenericType && 
     info.PropertyType.Name.StartsWith("IList") && 
     info.PropertyType.GetGenericArguments().Length > 0 && 
     info.PropertyType.GetGenericArguments()[0] == typeof(string) 
     ) 
    { 
     return true; 
    } 
} 
Questions connexes