2009-02-11 4 views
11

Durch Reflektion, gibt es eine Möglichkeit für mich, den enthaltenen Typ einer generischen Liste zu betrachten, um zu sehen, aus welchem ​​Typ die Sammlung besteht? Zum Beispiel:Get contained Typ in einer Liste <T> durch Reflexion?

ich einen einfachen Satz von Business-Objekten, die von einer Schnittstelle ableiten, wie folgt aus:

public interface IEntityBase{} 

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

public class ChildBusinessEntity : IEntityBase{} 

In dem Fall, wo ich durch die Eigenschaften von BusinessEntity durch Reflexion am Iterieren, gäbe es ein Möglichkeit für mich zu sehen, ob die Objekte innerhalb dieser von IEntityBase abgeleiteten Listen geschachtelt sind?

Pseudo codiert (schlecht) wie folgt aus:

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

Option Nur die ich bisher gehört habe, wäre das funktioniert, lesen Sie das erste Element aus dieser Liste zu ziehen, dann in seiner Art aussehen . Jeder leichtere Weg (vor allem weil ich nicht garantieren kann, dass die Liste nicht leer sein wird)?

+0

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

+0

kein Betrogene: Diese Frage ist zu geschachtelten Typen gefragt, während dieser einen (trotz der Titel) scheint nach einem generischen Typ zu fragen. – ChrisW

+0

Hoppla, du hast recht, mein Fehler: P –

Antwort

27

Sie haben Vorausgesetzt, die System.Type, die Ihre List<> beschreibt, können Sie die Type.GetGenericArguments() Methode verwenden, um die Type Instanz zu erhalten, die beschreibt, was es ist eine Liste von.

2

so etwas wie das?

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; 
    } 
} 
Verwandte Themen