2012-05-07 11 views
8

मैं DecimalConverter और Int32Converter कक्षाएं, जो असंगत परिणाम लौटने लगते हैं के साथ किसी समस्या में चल रहा हूँ, के रूप में निम्नलिखित सरल सांत्वना कार्यक्रम द्वारा प्रदर्शन:टाइपकॉन्टर प्राचीन प्रकार के लिए टूटा?

using System; 
using System.ComponentModel; 

class App 
{ 
    static void Main() 
    { 
     var decConverter = TypeDescriptor.GetConverter(typeof(decimal)); 
     Console.WriteLine("Converter: {0}", decConverter.GetType().FullName); 
     Console.WriteLine("CanConvert from int to decimal: {0}", decConverter.CanConvertFrom(typeof(int))); 
     Console.WriteLine("CanConvert to int from decimal: {0}", decConverter.CanConvertTo(typeof(int))); 

     Console.WriteLine(); 

     var intConverter = TypeDescriptor.GetConverter(typeof(int)); 
     Console.WriteLine("Converter: {0}", intConverter.GetType().FullName); 
     Console.WriteLine("CanConvert from int to decimal: {0}", intConverter.CanConvertTo(typeof(decimal))); 
     Console.WriteLine("CanConvert to int from decimal: {0}", intConverter.CanConvertFrom(typeof(decimal))); 
    } 
} 

इस से उत्पादन इस प्रकार है के रूप में:

Converter: System.ComponentModel.DecimalConverter 
CanConvert from int to decimal: False 
CanConvert to int from decimal: True 

Converter: System.ComponentModel.Int32Converter 
CanConvert from int to decimal: False 
CanConvert to int from decimal: False 

जब तक मैं TypeConverters गलत तरीके से समझने रहा हूँ, निम्नलिखित सच धारण करना चाहिए:

TypeDescriptor.GetConverter(typeof(TypeA)).CanConvertFrom(typeof(TypeB)) 

कम से कम System.Int32 और System.Decimal के मामले में

TypeDescriptor.GetConverter(typeof(TypeB)).CanConvertTo(typeof(TypeA)) 

के रूप में एक ही परिणाम देना चाहिए, वे नहीं है।

मेरा प्रश्न यह है: क्या किसी को पता है कि यह डिज़ाइन द्वारा है या नहीं? या C# वास्तव में टूटा हुआ देशी प्रकारों के लिए TypeConverters हैं?

+2

मुझे समझ में नहीं आता कि JSON को deserializing करते समय आपको 'int' से 'दशमलव' रूपांतरित करने की आवश्यकता कैसे होती है, क्योंकि JSON में तार होते हैं,' int 'नहीं। – svick

+0

मैंने स्पष्ट करने के लिए अपना प्रश्न बढ़ाया है। मुझे एहसास है कि मैं संभवतः यह सुनिश्चित करके इसे संभाल सकता हूं कि मैं ब्राउज़र पर अपने रास्ते पर एक स्ट्रिंग के रूप में सब कुछ क्रमबद्ध करता हूं, लेकिन यह वास्तव में सवाल नहीं है, और अधिक प्रस्ताव है। – rossipedia

उत्तर

2
Int32Converter के लिए MSDN documentation के अनुसार

...

इस कनवर्टर केवल एक स्ट्रिंग से करने के लिए एक 32-बिट पर हस्ताक्षर किए पूर्णांक वस्तु और बदल सकते हैं।

मैं टिप्पणियों में @ एसविक से सहमत हूं, हालांकि, मुझे समझ में नहीं आ रहा है कि आपको इंटेल 32 के माध्यम से पहली बार एक JSON स्ट्रिंग को deserialize करने की आवश्यकता क्यों होगी।

+0

मैं नहीं करता हूं। एएसपी.नेट एमवीसी का डिफ़ॉल्ट JSON हैंडलिंग करता है। AJAX के माध्यम से 'एप्लिकेशन/जेसन' अनुरोध सबमिट करते समय, डिफ़ॉल्ट 'जावास्क्रिप्टसेरियलाइज़र' इंट 32 ऑब्जेक्ट्स के रूप में सभी संपूर्ण संख्याओं को विलुप्त कर देगा। मुझे समस्या है जब सिस्टम उन Int32 मानों को मेरे मॉडल की 'दशमलव' प्रॉपर्टी पर वापस मैप करने का प्रयास करता है। – rossipedia

+2

@ ब्रायनरॉस क्या आपने देखा [यह स्टैक ओवरफ्लो प्रश्न?] (Http://stackoverflow.com/questions/8964646/javascriptserializer-and-asp-net-mvc-model-binding-yield- अलग-results) मुझे संदेह है कि यह काफी है आपकी समस्या के समान, उसमें आपको अपने दशमलव को उद्धृत तारों के रूप में पारित करने की आवश्यकता है। 'JavaScriptSerializer' गलत तरीके से अनुमान लगाएगा और इसके खराब अनुमान के आधार पर अनुचित रूपांतरणों को आजमाएगा, लेकिन स्पष्ट रूप से मानों को उद्धृत करने से रूपांतरण को टाइप करने के लिए एक स्ट्रिंग का प्रयास किया जाएगा जो एक और अधिक व्यावहारिक समाधान होना चाहिए। –

+0

धन्यवाद क्रिस, मैं निश्चित रूप से आपसे सहमत हूं, और असल में मैं इस समाधान पर पहले ही पहुंच चुका हूं। मैं अभी भी जानना चाहता हूं कि TypeConverter की लगातार क्षमताओं की रिपोर्ट क्यों नहीं की जाती है। – rossipedia

1

आपको इस तरह के मामलों में टाइप कन्वर्टर्स से निपटने की आवश्यकता नहीं है। आप अपने मॉडल वर्ग deserialize चाहते हैं, की तरह कुछ कार्य करें:

serializer.Deserialize<Model>(json) 

और यह आप के लिए सभी रूपांतरणों की देखभाल करेंगे।

यदि आपको वास्तव में मैन्युअल रूप से रूपांतरण करने की आवश्यकता है, तो Convert.ToDecimal(integer) (या Convert.ChangeType(integer, typeof(decimal))) का उपयोग करें और यह सही तरीके से काम करेगा।

+0

यह मेरा कोड नहीं है जो TypeConverters का उपयोग कर रहा है। यह एएसपी.नेट एमवीसी है। हालांकि, प्रश्न टाइपकॉन्टरर्स के बारे में है और वे असंगत परिणाम क्यों उत्पन्न करते हैं, जेएसओएन क्रमबद्धता/deserialization नहीं। – rossipedia

+0

तो शायद यह सवाल नहीं है जिसे आप पूछना चाहिए। मुझे लगता है कि आप JSON deserialization के संबंध में कुछ गलत कर रहे हैं, यह प्रकार कनवर्टर्स की गलती नहीं है। – svick

+1

मेरे द्वारा पोस्ट किए गए नमूना कार्यक्रम में जेसन के साथ कुछ लेना देना नहीं है, फिर भी यह मेरे द्वारा वर्णित व्यवहार को प्रदर्शित करता है और इसके बारे में पूछा जाता है। और जैसा कि मैंने पहले कहा है, मेरा कोड वास्तव में deserialization प्रदर्शन नहीं कर रहा है। यह एएसपी.नेट एमवीसी कोड है जो है। JSON अनुरोध में एक अनगिनत संख्या मान को वास्तविक समस्या के कारण स्वचालित रूप से दशमलव संपत्ति पर मैप नहीं किया जा सकता है, जिसके बारे में मैंने पूछा था। यहां कठोर होने की कोशिश नहीं कर रहा है, मैं पूरी तरह से जानता हूं कि मेरी विशेष JSON समस्या को कैसे ठीक किया जाए। यह कोई मुद्दा नहीं है। मैं देशी संख्यात्मक प्रकारों के संबंध में TypeConverters के व्यवहार के बारे में बहुत विशेष रूप से पूछ रहा हूं। – rossipedia

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