2011-12-18 12 views
18

मुझे क्या करना चाहते हैं कुछ इस तरह है:सी # प्रतिबिंब: एक Nullable <int> के प्रकार कैसे प्राप्त करें?

switch(myObject.GetType().GetProperty("id")) 
{ 
    case ??: 
     // when Nullable<Int32>, do this 
    case ??: 
     // when string, do this 
    case ??: 
     // when Nullable<bool>, do this 

object.GetType के तहत क्या पथ() डेटाप्रकार है कि मैं एक मामले कथन का उपयोग की तुलना कर सकते की स्ट्रिंग नाम होता है? मुझे इस प्रकार को जानने की ज़रूरत है, इसलिए मेरे पास कई कनवर्ट्स में से एक हो सकता है। ToInt32 (स्ट्रिंग) जो प्रतिबिंब का उपयोग करके myObject का मान सेट करेगा।

+1

यह लगभग निश्चित रूप से गलत काम कर रहा है। एक विशाल स्विच स्टेटमेंट का उपयोग करने के बजाय, आप पॉलिमॉर्फिज्म का लाभ क्यों नहीं ले सकते? –

+0

यदि आप विभिन्न पैरामीटर प्रकारों के साथ कई फ़ंक्शन बनाने का सुझाव दे रहे हैं, तो मैं कर सकता था। इस मामले में, मैं एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट्स के विभिन्न प्रकारों के गुणों की एक प्रतिलिपि बना रहा हूं जहां एक हमेशा एक स्ट्रिंग प्रकार होता है। इसलिए, मुझे इसे असाइन करने के लिए मान को परिवर्तित करने की आवश्यकता है। प्रतिबिंब के साथ और मुझे बहुत कम अनुभव है। –

+0

@ कोडीग्रे वह प्रतिबिंब के संबंध में कुछ कर रहा है, अपने स्वयं के ओआरएम लिखते हुए कहें। या इन सभी डीएओ के लिए एक कस्टम धारावाहिक लिखना, आप कभी नहीं जानते। – nawfal

उत्तर

8

अद्यतन: ऐसा लगता है कि सी # 7 Type एस पर स्विचिंग का समर्थन करेगा क्योंकि इस प्रश्न के पूछने वाले ने ऐसा करने का प्रयास किया था। यह थोड़ा अलग है हालांकि सिंटैक्स लैंडमाइन्स के लिए देखें।

आप इसे तुलना करने के लिए एक स्ट्रिंग नाम की जरूरत नहीं है:

if (myObject.GetType().GetProperty("id").PropertyType == typeof(Nullable<Int32>)) 
    // when Nullable<Int32>, do this 
else if (myObject.GetType().GetProperty("id").PropertyType == typeof(string)) 
    // when string, do this 
else if (myObject.GetType().GetProperty("id").PropertyType == typeof(Nullable<bool>)) 
    // when Nullable<bool>, do this 
+1

क्या आप वाकई .GetType() टाइप करने के लिए तुलना करते हैं (Nullable ) या यह GetType() के अंतर्गत एक संपत्ति है? मान लीजिए int? और Nullable समान प्रकार हैं, ए। गेट टाइप()! = टाइपोफ (Nullable )। –

+0

आपको शायद 'स्विच' कथन के बजाय 'if' कथन के साथ ऐसा करना होगा। लेकिन, आप की तरह, मैंने पहले कभी नहीं किया है। यह मेरे लिए एक विरोधी पैटर्न की तरह दिखता है। –

+0

वीएस स्टूडियो में उपरोक्त कोड स्विच (myObject.GetType()) पर आतंक हमले होंगे "अपेक्षित अभिन्न प्रकार का मूल्य" और केस टाइपऑफ (XXX) "आईडीएस त्रुटि" की एक आईडीई त्रुटि दिखाएगा "कॉन्स्टेंट वैल्यू अपेक्षित है" – heads5150

0

रूप @Cody ग्रे ने कहा कि अगर बयान शायद सबसे अच्छा तरीका है

var t = myObject.GetType(); 

if (t == typeof(Nullable<int>)) 
{ } 
else if (t == typeof(string)) 
{} 
else if (t==typeof(Nullable<bool>)) 
{} 
+2

दिलचस्प रूप से पर्याप्त, जब 'int? ए = 3' फिर 'टाइपऑफ (ए)' है "System.Int32" –

+1

@ डॉज़िम: यहां स्पष्टीकरण देखें: http://stackoverflow.com/questions/785358/nullable-type-is-not-a-nullable -प्रइप –

+1

@ डॉज़िम 'टाइपोफ (ए) 'संकलित भी नहीं करता है। यह 'ए। गेट टाइप() 'है जो' int 'देता है। – CodesInChaos

44

मैं निम्नलिखित का उपयोग कर रहे हो जाएगा यह जांचने के लिए कोड का प्रकार टाइप करें कि क्या प्रकार शून्य है और वास्तविक प्रकार प्राप्त करने के लिए:

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 
{ 
    return Nullable.GetUnderlyingType(type); 
} 

यदि प्रकार है उदाहरण के लिए यह कोड शून्य भाग (अंतर्निहित प्रकार) देता है। यदि आपको ऑब्जेक्ट को विशिष्ट प्रकार में बदलने की आवश्यकता है तो आप System.Convert.ChangeType विधि का उपयोग कर सकते हैं।

+0

+1 के रूप में घोषित किया गया है और यह ध्यान देने योग्य है कि यह विधि अंदर की जांच करता है और दिए गए प्रकार को टाइप नहीं किया जाता है (Nullable <>) 'तो अगर कथन के बजाय बाद में एक शून्य जांच कर रहे हैं तो भी काम करेगा। – Connell

16

प्रश्न बहुत भ्रमित है। क्या ऑब्जेक्ट "myObject" है जो एक शून्य int हो सकता है? या संपत्ति "आईडी" संभवतः प्रकार शून्य शून्य int है?

यदि पूर्व में, आपके प्रश्न का उत्तर नहीं दिया जा सकता है क्योंकि यह झूठ का अनुमान लगाता है। एक बॉक्सिंग nullable int के रूप में ऐसी कोई बात नहीं है। मुझे लगता है कि if (myobject.GetType() == typeof(int?)) का प्रस्ताव देने वाले सभी उत्तर गलत हैं; स्थिति कभी सच नहीं होगी।

जब आप ऑब्जेक्ट करने के लिए एक निरर्थक int परिवर्तित करते हैं, तो यह एक शून्य संदर्भ (यदि शून्य के int के पास कोई मूल्य नहीं है) हो जाता है या यह एक बॉक्सिंग int बन जाता है। यह निर्धारित करने का कोई तरीका नहीं है कि किसी ऑब्जेक्ट में एक निरर्थक int है क्योंकि ऑब्जेक्ट कभी में एक शून्य शून्य है।

यदि उत्तरार्द्ध, संपत्ति प्रकार से typeof(int?) की तुलना करें। आप एक स्विच का उपयोग नहीं कर सकते; स्विच मामलों के लिए केवल स्थिरांक का उपयोग किया जा सकता है और प्रकार स्थिरांक नहीं हैं।

यह सब कहा, यह एक खराब कोड गंध है। आप पहली जगह में प्रतिबिंब का उपयोग क्यों कर रहे हैं?

+0

अद्यतन: सी # 7 में, स्विच स्टेटमेंट्स को निरंतर अभिव्यक्ति की आवश्यकता नहीं है :) –

+0

और प्रकारों पर स्विच करने के लिए एक तंत्र प्रदान करें। उस सुविधा का प्रस्ताव पहली बार 2001 में किया गया था? मुझे लगता है। तो, 16 साल, बुरा नहीं है। –

2

इननेट में, मूल्य प्रकारों के उदाहरण केवल संबंधित प्रकार की जानकारी के साथ बिट्स का संग्रह हैं। Nullable<T> के अलावा प्रत्येक मान प्रकार के लिए, सिस्टम भी System.ValueType से प्राप्त एक संबंधित वर्ग प्रकार को स्वतः उत्पन्न करता है। एक विस्तृत रूपांतरण मूल्य प्रकार से स्वत: जेनरेट किए गए वर्ग प्रकार तक, और स्वत: जेनरेट किए गए वर्ग प्रकार से मूल्य प्रकार में एक संकुचित रूपांतरण मौजूद है। Nullable<T> के मामले में, मूल्य प्रकार से रूपांतरणों के साथ कोई संबंधित ऑटो-जेनरेटेड क्लास प्रकार नहीं है; इसके बजाय, रूपांतरणों को विस्तृत करना Nullable<T> और T से जुड़े वर्ग प्रकार दोनों दिशाओं में मौजूद है।

जहां तक ​​मेरा बता सकते हैं, यह अजीब व्यवहार null और एक खाली Nullable<T> के बीच तुलना सही वापस जाने के लिए अनुमति देने के लिए लागू किया गया था।

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