2008-10-24 12 views
13

कक्षा के भीतर एक सामान्य टाइप की गई कक्षा का प्रकार कैसे प्राप्त करूं?.NET: सामान्य टाइप किए गए वर्ग के भीतर प्रकार को कैसे जांचें?

एक उदाहरण:

मैं एक सामान्य टाइप किए हुए संग्रह को लागू करने ICollection < टी> निर्माण। भीतर मैं

public void Add(T item){ 
     ... 
    } 

    public void Add(IEnumerable<T> enumItems){ 
     ... 
    } 

मैं दिए गए प्रकार टी के लिए विधि के भीतर पूछ सकते हैं कैसे की तरह तरीकों है? के रूप में टी संग्रह का उपयोग करता जोड़ें (वस्तु आइटम) जोड़ें के बजाय (IEnumerable < वस्तु> enumItems) भले ही पैरामीटर IEnumerable है वस्तु प्रयोग किया जाता है:

मेरे सवाल के लिए कारण है। तो पहले मामले में यह समेकित संग्रह की कई वस्तुओं के बजाय एक संपूर्ण वस्तु को एक ऑब्जेक्ट के रूप में जोड़ देगा।

तो मैं

if (T is object) { 
    // Check for IEnumerable 
} 

लेकिन निश्चित है कि सी # में काम नहीं कर सकता की तरह कुछ की जरूरत है। सुझाव?

बहुत बहुत धन्यवाद!

माइकल

उत्तर

21

व्यक्तिगत रूप से, मैं पक्ष हैं AddRange को IEnumerable<T> विधि का नाम बदलकर मुद्दा कदम। यह ऐसे मुद्दों से बचाता है, और मौजूदा API जैसे List<T>.AddRange के साथ संगत है।

T जब आप IEnumerable<T> (दुर्लभ, मैं स्वीकार करूंगा) लागू करना चाहता हूं तो यह चीजों को भी साफ रखता है।

29

आप उपयोग कर सकते हैं: typeof(T)

if (typeof(T) == typeof(object)) { 
    // Check for IEnumerable 
} 
+2

यह सवाल शीर्षक में पूछा जवाब देता है। – reads0520

-1

आप एक सामान्य वर्ग/विधि आप एक संदर्भ प्रकार के T सीमित करने में is ऑपरेटर का उपयोग करना चाहते हैं:

public void MyMethod<T>(T theItem) where T : class 
{ 
    if (theItem is IEnumerable) { DoStuff(); } 
} 
+0

मुझे लगता है कि वह सिर्फ चिंतित है जब एक गैर-जेनेरिक आईनेमरेबल सिस्टम के रूप में पारित किया जाता है। जब टी सिस्टम होता है तो ऑब्जेक्ट करें। –

+0

मार्क्सिडाड, हाँ, यह सही है। – Mil

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