2011-06-26 16 views
16

को देखते हुए यह:क्या यह पता लगाने का एक सामान्य तरीका है कि संपत्ति का प्रकार एक संख्यात्मक प्रकार है या नहीं?

class InvoiceHeader { 
    public int InvoiceHeaderId { get; set; } 
    IList<InvoiceDetail> LineItems { get; set; } 
} 

मैं वर्तमान में अगर एक वर्ग एक संग्रह संपत्ति है पता लगाने के लिए इस कोड का उपयोग कर रहा हूँ:

void DetectCollection(object modelSource) 
{  
    Type modelSourceType = modelSource.GetType(); 
    foreach (PropertyInfo p in modelSourceType.GetProperties()) 
    { 
     if (p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(IList<>)) 
     { 
      System.Windows.Forms.MessageBox.Show(p.Name); 
     } 
    } 
} 

वहाँ एक सामान्य तरीके से करता है, तो पंक्ति आइटम का पता लगाने के है एक गणनीय प्रकार है ? कुछ अन्य संख्यात्मक प्रकार (उदा। आईसीओलेक्शन) का उपयोग करेंगे, न कि एक आईएलआईस्ट।

उत्तर

38

आपका कोड वास्तव में नहीं है हेक अगर गुण Enumerable प्रकार हैं लेकिन यदि वे जेनेरिक IList हैं। इस प्रयास करें:

if(typeof(Enumerable).IsAssignableFrom(p.PropertyType)) 
{ 
    System.Windows.Forms.MessageBox.Show(p.Name); 
} 

या इस

if (p.PropertyType.GetInterfaces().Contains(typeof(IEnumerable))) 
{ 
    System.Windows.Forms.MessageBox.Show(p.Name); 
} 
+2

p.PropertyType.GetInterfaces() में एक एक्सटेंशन लाइब्रेरी बना रहा हूं। इसमें शामिल है (टाइपोफ (आईनेमरेबल)) और पी.प्रॉपर्टी टाइप! = टाइपोफ (स्ट्रिंग) या अन्यथा स्ट्रिंग प्रॉपर्टी कंडिशन को – Oleg

+0

नोट पास करेगी कि सभी संख्याएं 'IENumerable' नहीं हैं, मुझे विश्वास है कि' GetEnumerator' फ़ंक्शन के साथ कुछ भी वास्तव में 'foreach' कथन –

+2

में जा सकता है हालांकि यह थोड़ा स्पष्ट हो सकता है, यह इंगित करने योग्य है कि एक स्ट्रिंग भी एक गणितीय प्रकार है। अगर कोई यह जांचना चाहता है कि कोई संपत्ति _any_ प्रकार की सूची या संग्रह है, तो आईसीओलेक्शन का उपयोग करके अधिक उपयुक्त होगा। – XtraSimplicity

1

IEnumerable सी # में सभी संख्यात्मक प्रकारों के लिए मूल प्रकार है, और इस प्रकार आप जांच सकते हैं कि संपत्ति आमतौर पर उस प्रकार की है या नहीं।

हालांकि यह ध्यान दिया जाना चाहिए कि सी # चीनी सिंटैक्स (उदाहरण के लिए फ़ोरैच लूप) को बांधने के तरीके में विशेष है, यह विधियों से जुड़ा हुआ है (इसलिए एक पूर्ण जांच के लिए आपको यह जांचना चाहिए कि किसी संपत्ति में GetEnumerator नामक विधि है (या तो IEnumerable.GetEnumerator या IEnumerable.GetEnumerator)

+0

आप बस के लिए 'IEnumerable ' प्रतिबिंब के साथ जांच नहीं कर सकता, एक 'ICollection के रूप में' बाहर करने के लिए वास्तव में है, और एक 'IEnumerable नहीं '। – Femaref

+2

फर्मारेफ आपका क्या मतलब है? 'ICollection ' 'IENumerable' से विरासत प्राप्त करता है, इसलिए 'IsAssignableFrom' परीक्षण अपेक्षित के रूप में कार्य करना चाहिए। – CodesInChaos

+0

'is' एक वर्ग/संरचना/आदि के साथ एक वस्तु उदाहरण की तुलना करता है। परिभाषा। 'P.PropertyType'' System.ype' प्रकार का है और 'IEnumerable' को लागू नहीं करता है, यह हमेशा 'झूठा' वापस आ जाएगा। – Femaref

2
if (invoiceHeader.LineItems is IEnumerable) { 
    // LineItems implements IEnumerable 
} 

यह अगर invoiceHeader के प्रकार के संकलन समय पर अज्ञात है काम नहीं करता है। उस मामले में मैं, जानना चाहता है कि वहाँ एक आम इंटरफेस नहीं है चाहते हैं क्योंकि संग्रह संपत्ति खोजने के लिए प्रतिबिंब का उपयोग काफी संदिग्ध है।

+0

आरई: "उस मामले में मैं जानना चाहता हूं कि एक आम इंटरफ़ेस क्यों नहीं है, क्योंकि संग्रह संपत्ति खोजने के प्रतिबिंब का उपयोग काफी संदिग्ध है।" - मैं NHibernate – Hao

संबंधित मुद्दे

 संबंधित मुद्दे