2009-02-11 11 views
11

प्रतिबिंब के माध्यम से, क्या मेरे पास जेनेरिक सूची के निहित प्रकार को देखने के लिए कुछ तरीका है यह देखने के लिए कि संग्रह किस प्रकार का है? एकप्रतिबिंब के माध्यम से एक सूची <T> सूची में निहित प्रकार प्राप्त करें?

public interface IEntityBase{} 

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

public class ChildBusinessEntity : IEntityBase{} 

मामले में जहां मैं प्रतिबिंब के माध्यम से BusinessEntity के गुणों के माध्यम से पुनरावृत्ति कर रहा हूँ, वहाँ होगा: उदाहरण के लिए:

मैं व्यापार वस्तुओं की एक सरल सेट है कि एक अंतरफलक से निकाले जाते हैं, इस तरह की है मेरे लिए यह देखने का तरीका है कि क्या उन सूचियों के अंदर नेस्टेड वस्तुएं आईएनएनटीटीबेस से ली गई हैं?

छद्म कोडित (बुरी तरह) इस तरह:

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

केवल विकल्प मैं अब तक सुना है, कि काम करता है, उस सूची से पहले आइटम बाहर निकलने के लिए है, तो अपने प्रकार पर देखने होगा । कोई आसान तरीका (विशेष रूप से क्योंकि मुझे गारंटी नहीं दी जा सकती है कि सूची खाली नहीं होगी)?

+0

शिकार: http://stackoverflow.com/questions/528546/type-getinterface-and-nested-types –

+0

नहीं एक शिकार: उस सवाल के बावजूद (नेस्टेड प्रकार के बारे में पूछ रहा है यह एक जबकि शीर्षक) एक सामान्य प्रकार के बारे में पूछता प्रतीत होता है। – ChrisW

+0

ओह, आप सही हैं, मेरा बुरा: पी –

उत्तर

27

आप यह मानते हुए System.Type जो अपने List<> का वर्णन करता है, तो आप Type उदाहरण जो बताती है कि यह क्या की एक सूची है पाने के लिए Type.GetGenericArguments() विधि का उपयोग कर सकते हैं।

2

ऐसा कुछ?

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; 
    } 
} 
संबंधित मुद्दे