2008-11-23 12 views
21

मेरा परिदृश्य सरल होना चाहिए ... जिस प्रकार मैं को से परिवर्तित करना चाहता हूं ALWAYS 'स्ट्रिंग' है। क्या मैं करने के लिए ... कन्वर्ट करने के लिए बहुत सी बातें हो सकता है चाहता हूँ - ints, datetimes, ... तार, आदिमैं रनटाइम पर प्रकार कैसे बदल सकता हूं?

यह आसान होगा:

string valueToConvertFrom = "123"; 

int blah = Convert.ToInt32(valueToConvertFrom); 

हालांकि ... मैं नहीं जानता कि (रनटाइम तक) कि जिस मूल्य को मैं कनवर्ट करने की आवश्यकता है वह 'Int' (या जो भी हो) है। मैं इस की कोशिश की है:

string valueToConvertFrom = "123"; 

Type convertToType = typeof(int); 

object blah = Convert.ChangeType(valueToConvertFrom, convertToType); 

लेकिन वह मेरा पीछा त्रुटि देता है: "। वस्तु IConvertible को लागू करना चाहिए"

मैं स्विच स्टेटमेंट नहीं करना चाहता हूं और टाइप कन्वर्ट के आधार पर "कन्वर्ट.ओब्लब्लैह" को कॉल करना चाहता हूं ... कोई सुझाव?

+0

फिर से खोलने और जवाब यह है कि आप पाया जोड़ने के लिए, के मामले में किसी और की है कृपया भविष्य में एक ही या एक ही समस्या –

+1

कारण मैंने इसे बंद कर दिया क्योंकि मेरा कोड इसमें एक बग था ... मैं शुरुआत में गलत क्षेत्र से खींच रहा था, और उस क्षेत्र ने आईकोनवर्टिबल को लागू नहीं किया था। दोनों उत्तरों के लिए +1 ... "स्ट्रिंग क्लास IConvertible लागू करता है, यह कोड बस काम करना चाहिए" यह सच है। लेकिन आशेर का समाधान बहुत अच्छा है क्योंकि मैंने कुछ नया सीखा (और यह एक बहुत साफ समाधान है)। एक बार फिर धन्यवाद! –

उत्तर

30

ऐसा करने का एक साफ तरीका टाइपकॉन्टर का उपयोग कर रहा है। आप TypeDescriptor.GetConverter पर कॉल करके और फिर कनवर्टर करने के लिए प्रकार कनवर्टर के उदाहरण का उपयोग करके एक प्रकार कनवर्टर का उदाहरण प्राप्त कर सकते हैं। तो कुछ इस तरह:

string valueToConvertFrom = "123"; 

Type convertToType = typeof(int); 

TypeConverter tc = TypeDescriptor.GetConverter(convertToType);    

object blah =tc.ConvertFromString(valueToConvertFrom); 
+0

यह शानदार है। बहुत बहुत धन्यवाद! – Stephen

+2

आशेर का उत्तर सिल्वरलाइट (वेब ​​या WP7x) पर लागू नहीं होता है, जहां TypeDescriptor उपलब्ध नहीं है। साथ ही, TypeDescriptor केवल एक प्रकार के लिए टाइप कनवर्टर देता है जिसने टाइपकॉन्टर परिभाषित किया है, जो स्वचालित रूप से अधिकांश प्रकारों पर लागू नहीं होता है। और TypeDescriptor द्वारा लौटाया गया टाइप कनवर्टर केवल दिए गए प्रकार के लिए परिभाषित पहला है। तो आप कम से कम कहने के लिए रूपांतरण परिदृश्यों के लिए आमतौर पर टाइपडिस्क्रिप्टर पर भरोसा नहीं कर सकते हैं। –

+1

यह भी याद रखें कि टाइपकॉन्टर न केवल एक अमूर्त बेस क्लास है जो कस्टम कार्यान्वयन की आवश्यकता है यदि आप इसे कस्टम क्लास रूपांतरण के लिए उपयोग कर रहे हैं, लेकिन यह अन्य तंत्रों की तुलना में अपेक्षाकृत धीमी है, क्योंकि यह प्रतिबिंब/खोज-आधारित है। –

5

स्ट्रिंग क्लास IConvertible लागू करता है, यह कोड बस काम करना चाहिए। आप .NET का कौन सा संस्करण लक्षित कर रहे हैं?

object o = Convert.ChangeType(str, convertToType); 

इसके अलावा, आपके द्वारा वर्णित अधिकांश प्रकारों में पार्स विधि लागू होती है, इसलिए आपका सर्वश्रेष्ठ शॉट ऐसा कुछ हो सकता है।

Type convertToType = ...; 
MethodInfo mi = convertToType.GetMethod("Parse", BindingFlags.Static); 
object blah; 
if(mi != null) 
{ 
    blah = mi.Invoke(null, new object[]{valueToConvertFrom}); 
} 
else 
{ 
    // the type doesn't implement the Parse method, handle it another way :/ 
} 
+2

ऐसा लगता है और एक हैक की तरह लगता है ... – Asher

5

टिमोथी सवाल है, के रूप में .NET में प्रकार रूपांतरण के सवाल पर आम तौर पर लागू किया, एक बहुत बड़ा मुद्दा है। जबकि रूपांतरण रणनीतियों ज्ञात प्रकारों के साथ विशिष्ट परिदृश्यों में कुछ हद तक सीधा है, दुर्भाग्यवश, .NET के किसी भी कार्यान्वयन में कोई सामान्यीकृत रणनीति नहीं है, रन-टाइम पर टाइप-टाइम पर टाइप रूपांतरण को दूसरे तरीके से टाइप करें, और न ही रेडमंड से आने वाली ऐसी रणनीति है। हालांकि, माइक्रोसॉफ्ट, प्रकार रूपांतरण की सामान्य अवधारणा के लिए कुछ अच्छे दिशा निर्देशों की आपूर्ति सहित:

मैं में एक ही सामान्य मुद्दे से निपटने के लिए किया है मेरी सिस्टम, और एक समाधान के रूप में मैंने सभी मानक रणनीतियों को एक विधि में समेकित किया है। इस मुद्दे का दायरा व्यापक है और संबंधित रूपांतरण रणनीतियां भिन्न हैं, इसलिए इस समेकित दृष्टिकोण को केवल एक पूर्ण तकनीकी लेख में शामिल किया जा सकता है। हालांकि, मैं उम्मीद करता हूं कि मैं अपने विधि दस्तावेज की एक प्रति उम्मीद में आशा करता हूं कि इससे आपको समग्र आवश्यकताओं पर दृढ़ समझ प्राप्त करने में मदद मिलेगी, यदि आप एक समान, सामान्यीकृत समाधान विकसित करना चाहते हैं तो आपको संबोधित करने की आवश्यकता होगी।यहाँ मेरी प्रलेखन के लिए लिंक है:

मुझे आशा है कि यह तुम बाहर में मदद करता है,

मार्क

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

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