2009-02-11 11 views
11

Yansımayla, koleksiyonun türünü görmek için genel bir Listenin içerdiği türe bakmamın bir yolu var mı? Örneğin:Yansıma yoluyla bir Liste <T>'un içerdiği türünü alın.

böyle bir arayüzden türetmek iş nesneleri basit bir dizi var: Ben yansıma yoluyla BusinessEntity özellikleri yineleme am durumda

public interface IEntityBase{} 

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

public class ChildBusinessEntity : IEntityBase{} 

, orada olacağını Nesnelerin IEntityBase'den türetilen listelerde iç içe geçip geçmediğini görmek için bir yol var mı? Böyle (kötü) kodlu

Sözde: Şimdiye kadar duyduğum Tek seçenek

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

, işler o zaman, bu listeden ilk öğeyi çekip türünün bakmak olurdu . Daha kolay bir yol (özellikle Listenin boş kalmayacağı garanti edilemediğinden)? Size varsayarsak

+0

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

+0

Değil dupe: bu soruyu rağmen (bu, oysa iç içe türleri soruyor başlık) genel bir türden soruyor gibi görünüyor. – ChrisW

+0

Oops, haklısın, benim kötü: P –

cevap

27

sizin List<> açıklanır System.Type var, bunu bir listesi açıklar Type örneğini almak için Type.GetGenericArguments() yöntemi kullanabilirsiniz.

2

bu gibi bir şey?

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; 
    } 
} 
İlgili konular