2009-09-23 27 views
7

का एक उद्देश्य के लिए प्रकार स्ट्रिंग की एक वस्तु कास्ट करने के लिए मैं इस XML दस्तावेज़कैसे गतिशील प्रकार टी

<AdditionalParameters> 
<PublishToPdf Type ="System.Boolean">False</PublishToPdf> 
</AdditionalParameters> 
मेरी कोड में

है और मैं <PublishToPdf> नोड युक्त तर्क की एक सरणी का निर्माण करने की कोशिश कर रहा हूँ।

object test = (object) ((typeof(publishNode.Attributes["Type"].value)) publishNode.InnerText); 

यह निश्चित रूप से संकलित समय पर टूटता है। मैं यह नहीं समझ सकता कि publishNode.InnerText('false') को XML फ़ाइल में निर्दिष्ट प्रकार के रनटाइम परिभाषित ऑब्जेक्ट में कैसे डालना है और इसे किसी ऑब्जेक्ट में संग्रहीत करना है (जो प्रकार को संरक्षित करेगा)।

उत्तर

19

आप Convert.ChangeType उपयोग कर सकते हैं:

object value = Convert.ChangeType(stringValue, destinationType); 
+0

बहुत बहुत धन्यवाद, यह ठीक काम किया। – LolaRun

+0

हां, और गंतव्य टाइप प्राप्त करने के लिए, var गंतव्य टाइप = टाइप करें। पर्स (publNode.Attributes ["टाइप"]। मान); – Digitalex

+0

टाइप.पर्स() मौजूद नहीं प्रतीत होता है। क्या आप किसी भी मौके से Type.GetType() का मतलब था? –

2

आप वही नहीं कर सकते जो आप करने की कोशिश कर रहे हैं। सबसे पहले, typeof कीवर्ड रनटाइम पर गतिशील मूल्यांकन की अनुमति नहीं देता है। Type.GetType(string) जैसी विधियों के साथ प्रतिबिंब का उपयोग करके ऐसा करने के साधन हैं, लेकिन Type इन प्रतिबिंबित कार्यों से लौटाई गई वस्तुओं का उपयोग कास्टिंग जैसे संचालन के लिए नहीं किया जा सकता है।

आपको जो करना है वह आपके प्रकार को स्ट्रिंग प्रस्तुति में बदलने और बदलने का साधन प्रदान करता है। किसी भी मनमाना प्रकार से कोई स्वचालित रूपांतरण नहीं है। आपके उदाहरण के लिए, आप bool.Parse या bool.TryParse का उपयोग कर सकते हैं, लेकिन वे bool प्रकार के लिए विशिष्ट हैं। सबसे प्राचीन प्रकारों पर समान तरीके हैं।

+0

स्ट्रिंग के माध्यम से जाकर मेरे लिए चाल थी। – Slion

1

सरल समाधान, यह मानते हुए वहाँ संभव प्रकार की एक सीमित संख्या है,

object GetValueObject(string type, string value) 
{ 
    switch (type) 
    { 
    case "System.Boolean": 
     return Boolean.Parse(value); 
    case "System.Int32": 
     return Int32.Parse(value); 
    ... 
    default: 
     return value; 
    } 
} 

var type = publishNode.Attributes["Type"].value; 
var value = publishNode.InnerText; 
var valueObject = GetValueObject(type, value); 
+0

मैं .net फ्रेमवर्क 2.0 के साथ काम कर रहा हूं। और मेरे पास var नहीं है। और आपके द्वारा सुझाए गए समाधान में सभी प्रकार के objets के निर्माण को कार्यान्वित करने वाला कारखाना है, जो अनगिनत हैं। लेकिन आपकी मदद के लिए धन्यवाद। – LolaRun

+0

ठीक है, var कोड को छोटा बनाने के लिए था, आप इन तीनों के लिए स्ट्रिंग, स्ट्रिंग, ऑब्जेक्ट का उपयोग कर सकते हैं। और, जैसा कि मैंने कहा था, अगर आपको केवल सीमित संख्या में समर्थन करने की आवश्यकता है, तो यह ठीक काम करेगा। यदि नहीं, तो आप कहने का अधिकार हैं कि यह व्यावहारिक नहीं है। – Digitalex

+1

सी # 6 के साथ आप 'केस नाम (System.Guid) का उपयोग कर सकते हैं: उदाहरण के लिए। अब स्ट्रिंग स्ट्रिंग के लिए कोई ज़रूरत नहीं है। नाम उत्पन्न समय संकलित है। –

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