2011-10-03 24 views
9

क्या यह जांचने का कोई तरीका है कि कोई वैरिएबल संदर्भ प्रकार का प्रकार है या नहीं?मैं कैसे जांच सकता हूं कि एक सामान्य विधि पैरामीटर एक मान प्रकार है या नहीं?

कल्पना कीजिए:

private object GetSomething<T>(params T[] values) 
{ 
    foreach (var value in values) 
    { 
     bool is ValueType; // Check if 'value' is a value type or reference type 
    } 
} 
+3

आपका प्रश्न संदिग्ध है। क्या आप जानना चाहते हैं कि एक विशेष चर * * एक मान प्रकार है, या * सामान्य निर्माण द्वारा केवल एक विशेष मूल्य प्रकार * हो सकता है? एक चर प्रकार ऑब्जेक्ट का हो सकता है, और एक बॉक्सिंग int शामिल हो सकता है। यह सामग्री एक मान प्रकार है लेकिन चर केवल इन्ट्स युक्त तक ही सीमित नहीं है। आप किसके बारे में परवाह करते हैं, और क्यों? –

उत्तर

15
bool isValueType = typeof(T).IsValueType; 

नौकरी किया ... यह फर्क नहीं पड़ता अगर कोई भी मान null है दिखेगा, और यह भी काम करता है एक खाली सरणी के लिए।

+6

चेतावनी: यदि आप पैथोलॉजिकल एज-केस प्रदान करना चाहते हैं, तो 'टी'' ऑब्जेक्ट 'बनें, और मानों को बक्से वाले structs पर जाने दें। –

+0

उस मामले में विधि पैरामीटर का प्रकार सिस्टम होगा। ऑब्जेक्ट, जो कि क्लास प्रकार है, और * टाइप टी के चर के संदर्भ में अर्थशास्त्र होगा, भले ही अंतर्निहित ऑब्जेक्ट एक बॉक्सिंग स्ट्रक्चर * हो। उदाहरण के लिए, मान लीजिए कि 'टी'' जेन्यूमेरेटर 'के लिए एक सामान्य बाध्य है, और 'x' और' y' प्रकार' टी' के चर हैं। यदि 'टी' एक संरचना प्रकार है, तो 'x = y' गणनाकर्ता राज्य की प्रतिलिपि बना सकता है; यदि 'टी' एक संदर्भ प्रकार है, * यहां तक ​​कि यदि वह ऑब्जेक्ट एक बॉक्स किए गए स्ट्रक्चर * है, तो' x' 'y' के राज्य को साझा करेगा। – supercat

0

आपकी हालत की तरह

var cond = false; 
if(value != null) 
    cond = value.GetType().IsValueType 
+3

असल में, यह सुरक्षित नहीं है, क्योंकि 'मान' संभावित रूप से दोनों रीफ-टाइप और वैल्यू-टाइप (बाद में' Nullable ') –

+0

के माध्यम से आग के साथ खेलना संभवतः 'शून्य' हो सकता है। 'मान' शून्य हो सकता है :-) – xanatos

+1

मैं देखता हूं, मेरे कोडर मस्तिष्क पर प्रतिष्ठा अंक लेने के लिए शिकार। –

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

  • कोई संबंधित समस्या नहीं^_^