2011-07-30 24 views
54

संभव डुप्लिकेट बनाने के लिए कैसे:
is there a generic Parse() function that will convert a string to any type using parse?एक सामान्य प्रकार कास्ट समारोह

मैं कुछ कार्यों को करने के लिए एक सामान्य समारोह बनाना चाहते हैं, जैसे:

ConvertValue<T>(string value) 

यदि Tint है तो फ़ंक्शन मूल्य को परिवर्तित करेगा int पर और परिणाम लौटें।

इसी प्रकार, यदि Tboolean है, समारोह valueboolean में बदल जाएंगे और यह वापस आ जाएगी।

यह कैसे लिखें?

+6

आप बदलना वर्ग को देखा है? पहिया को फिर से शुरू करने में कोई बात नहीं जब तक कि आपको कुछ विशेष की आवश्यकता न हो। http://msdn.microsoft.com/en-us/library/system.convert(v=VS.85).aspx –

+0

बीटीडब्ल्यू, यह रूपांतरण एक कलाकार नहीं है। –

+0

कास्टिंग स्पष्ट रूपांतरण ऑपरेटर को वैसे भी बुलाया जाने का कारण बनता है। –

उत्तर

151

ऐसा कुछ?

public static T ConvertValue<T>(string value) 
{ 
    return (T)Convert.ChangeType(value, typeof(T)); 
} 

फिर आप इसे इस तरह उपयोग कर सकते हैं:

int val = ConvertValue<int>("42"); 

संपादित करें:

तुम भी इस अधिक सामान्य कर सकते हैं और भरोसा नहीं एक string पैरामीटर प्रकार प्रदान की पर U लागू करता IConvertible - इसका मतलब है कि आपको दो प्रकार के पैरामीटर निर्दिष्ट करना होगा हालांकि:

public static T ConvertValue<T,U>(U value) where U : IConvertible 
{ 
    return (T)Convert.ChangeType(value, typeof(T)); 
} 

मुझे InvalidCastException अपवाद को पकड़ने पर विचार किया गया जो Convert.ChangeType() द्वारा उठाया जा सकता है - लेकिन आप इस मामले में क्या वापस आ जाएंगे? default(T)? यह अपवाद के साथ कॉलर सौदा होने के साथ और अधिक उपयुक्त लगता है।

+3

अच्छी तरह से किया गया। बस एक उपयोग नोट, हालांकि: असमर्थित रूपांतरणों के लिए अपवाद हैंडलिंग को लागू करना न भूलें। –

+3

@Evan: मेरा अपडेट देखें - मुझे लगता है कि कॉलर को इस अपवाद को संभालना चाहिए क्योंकि रूपांतरण विधि में इसे संभालने का कोई अच्छा तरीका नहीं है - 'डिफ़ॉल्ट (टी)' को वापस गलत लगता है। – BrokenGlass

+0

@ ब्रोकन ग्लास: मैं सहमत हूं। सहायक विधि के भीतर इसे संभालने का कोई साफ तरीका नहीं है। अगर मैं इसका इस्तेमाल कर रहा था, तो मैं 'ट्राई-कैच' ब्लॉक के साथ कॉल को घेरेगा। –

-2

कन्वर्टवेल्यू (सिस्टम.ऑब्जेक्ट ओ), तो आप मूल्य के साथ काम करने के लिए ओ। गेट टाइप() परिणाम और अप-कास्ट ओ द्वारा शाखाएं निकाल सकते हैं।

+1

ओपी की तुलना में विशेष रूप से जेनेरिक – iandotkelly

6

शायद के रूप में साफ नहीं IConvertible दृष्टिकोण के रूप में देख रहे हैं, तब तक आप हमेशा सीधा जाँच typeof(T) वापस जाने के लिए इस्तेमाल कर सकते हैं एक T:

public static T ReturnType<T>(string stringValue) 
{ 
    if (typeof(T) == typeof(int)) 
     return (T)(object)1; 
    else if (typeof(T) == typeof(FooBar)) 
     return (T)(object)new FooBar(stringValue); 
    else 
     return default(T); 
} 

public class FooBar 
{ 
    public FooBar(string something) 
    {} 
} 
+0

का उपयोग करके कुछ मांगने के लिए यह तकनीक उपयोगी होती है जब आप कुछ प्रकार के लिए विशेष तर्क चाहते हैं –

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