2011-10-27 7 views
11

है, मुझे एक सामान्य विधि मिली है जो एक आईडी को स्ट्रिंग से बदलती है (उदाहरण के लिए, एक एएसपी.नेट फॉर्म पर एक छिपी हुई फ़ील्ड के मान से पुनर्प्राप्त) टाइप करें और इसके साथ कुछ करता है।स्ट्रिंग से जेनेरिक प्रकार में मूल्य को कनवर्ट करें जो या तो GUID या int

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId) 
{ 
    T id = (T)Convert.ChangeType(rawId, typeof(T)); 
    doSomethingWithId(id); 
} 

टी या तो Guid या Int32 और इसके बाद के संस्करण कोड (रनटाइम पर) से अधिक हो जाता है, जब यह Guid है, कह रही है कि Guid के लिए स्ट्रिंग से डाली अमान्य है किया जाएगा।

तो मैंने सोचा कि मैं प्रकार की जांच करने के लिए प्रयास कर सकते हैं और अगर Guid, एक नया GUID का दृष्टांत:

var id = default(T); 
if (id is Guid) 
    id = new Guid(rawId); 
else 
    id = (T)Convert.ChangeType(rawId, typeof(T)); 

अब यह एक त्रुटि देता है (संकलन समय पर) है कि Guid टाइप करने के लिए टी

नहीं बदला जा सकता

यह भी सुनिश्चित नहीं है कि इस के आसपास कैसे काम करें। कोई सुझाव?

उत्तर

21

नीचे कोड कोड के साथ रूपांतरण के साथ ठीक काम करता है। जाँच यह

id = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text); 
4

तो T या तो Guid या Int32 हो जाएगा तो यह वास्तव में बहुत सामान्य नहीं है, यह क्या है? बस इसके बजाय दो विधियां लिखें - या तो अलग-अलग नामों के साथ, या संभवतः अधिभार। मुझे यहां जेनेरिक का उपयोग करने में लाभ दिखाई नहीं देता है, और यह आपके कोड को जितना जटिल होना चाहिए उससे कहीं अधिक जटिल हो सकता है।

+0

आप सही हैं, लेकिन यह एक काल्पनिक उदाहरण का एक सा है, वहाँ है कि विधि की सभी खूबियों का है और यह के व्यापक संदर्भ में बातें आसान बनाने पड़ता कि मैं 'मी कर रही है। –

+0

@ वेली: यही कारण है कि जब आप कोई प्रश्न लिखते हैं और प्रतिनिधि चित्र देते हैं तो सावधान रहना उचित होता है। मैं अब भी इसे दो सार्वजनिक गैर-जेनेरिक तरीकों में विभाजित करने पर विचार करता हूं जो कार्यान्वयन के * भाग * के रूप में एक सामान्य जेनेरिक निजी विधि का उपयोग कर सकते हैं। –

1

आप इस शायद कुछ इस तरह की कोशिश कर सकते हैं:

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId) 
{ 
    T id = (T)Activator.CreateInstance(typeof(T), new object[] { rawId }); 
    doSomethingWithId(id); 
} 
संबंधित मुद्दे