2009-02-11 15 views
11

A través de la reflexión, ¿hay alguna manera de que mire el tipo contenido de la lista genérica para ver de qué tipo es la colección? Por ejemplo:Obtener contenido tipo en una lista <T> a través de la reflexión?

Tengo un simple conjunto de objetos de negocio que se derivan de una interfaz, como esto:

public interface IEntityBase{} 

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

public class ChildBusinessEntity : IEntityBase{} 

En el caso en el que estoy iteración a través de las propiedades de BusinessEntity través de la reflexión, habría una Cómo puedo ver si los objetos anidados dentro de esas listas derivan de IEntityBase?

Pseudo codificado (mal) de esta manera:

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

opción Sólo he oído hasta ahora, que funciona, sería la de sacar el primer elemento de esa lista, a continuación, busque en su tipo . ¿Alguna manera más fácil (especialmente porque no se puede garantizar que la Lista no esté vacía)?

+0

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

+0

No es una víctima: que la pregunta de preguntar sobre los tipos anidados, mientras que éste (a pesar de la título) parece estar preguntando sobre un tipo genérico. – ChrisW

+0

Vaya, tienes razón, mi mal: P –

Respuesta

27

Asumiendo que tienen la System.Type que describe su List<>, puede utilizar el método Type.GetGenericArguments() para obtener la instancia Type que describe lo que es una lista de.

2

algo como esto?

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; 
    } 
} 
Cuestiones relacionadas