2012-03-01 9 views
5

मैं किसी दिए गए ऑब्जेक्ट को किसी दिए गए ऑब्जेक्ट को कवर करने के लिए एक विधि लिखने की कोशिश कर रहा हूं। मैं इस के साथ शुरू किया:सी # मुझे कुछ जेनेरिक कास्टिंग उत्कृष्टता के साथ मदद करें

private static T TryCast<T>(object o) 
{ 
    return (T) o; 
} 

में जा रहे हैं, मुझे पता है कि काम करने के लिए नहीं जा रहा है, लेकिन यह अवधारणा को दिखाता है। अब, मुझे समस्याएं शुरू होने जा रही हैं जब मेरे पास ऐसे प्रकार हैं जो स्वचालित रूप से नहीं डाले जाएंगे, जैसे स्ट्रिंग -> डेटटाइम। मैं इन मामलों से निपटने के लिए कनवर्ट क्लास का उपयोग करने की कोशिश कर रहा था, लेकिन मुझे रनटाइम त्रुटि के बजाय बस संकलन समय त्रुटि मिलती है। निम्नलिखित कोड टाइप करने के लिए संकलन त्रुटि "प्रकार 'स्ट्रिंग' की अभिव्यक्ति नहीं दिया जा सकता हो जाता है 'टी'

private static T TryCast<T>(object o) 
{ 
    var typeName = typeof (T).FullName; 

    switch (typeName) 
    { 
     case "System.String": 
      return (T) Convert.ToString(o); 
     default: 
      return (T) o; 
    } 
} 

मैं भी Convert.ChangeType() के बारे में पता कर रहा हूँ, लेकिन अगर यह बढ़त संभाल लेंगे मैं सोच रहा हूँ मामलों है कि मैं अन्यथा ऊपर स्विच में संभाल होगा, कहा स्ट्रिंग की तरह -।> दिनांक समय है कि मैं सामान्य रूप से बस के लिए Convert.ToDateTime प्रयोग करेंगे

private static T TryCast<T>(object o) 
{ 
    return (T)Convert.ChangeType(o, typeof(T)); 
} 

तो, क्या मेरी सबसे अच्छा विकल्प है किसी को देने के कर सकते हैं? मुझे एक व्यावहारिक दृष्टिकोण, मैं इसे वहां से ले जा सकता हूं।

+0

ठीक है, थोड़ा संदर्भ देने के लिए, इस विधि के लिए तत्काल उपयोग डेटारो ऑब्जेक्ट में कॉलम मानों से टाइप टी के उदाहरण पर गुणों को गतिशील रूप से असाइन करना है। मैं एक शब्दकोश <स्ट्रिंग, स्ट्रिंग> में कहां पास करूंगा जहां उदाहरण पर कुंजी = संपत्ति का नाम और डेटारो पर वैल्यू = कॉलम नाम। मेरे पास पहले से प्रॉपर्टीइफॉस प्राप्त करने के लिए लिखे गए प्रतिबिंब हैं और इंस्टेंस मान सेट करें। यह कास्टिंग बिट पहेली का मेरा आखिरी टुकड़ा है। मैं इसे यथासंभव पुन: प्रयोज्य बनाना चाहता हूं, लेकिन अगर आपके दायरे को मेरे उदाहरण में सीमित करना आसान बनाता है, तो हो। –

+0

मुझे पता है कि उपरोक्त दूसरा उदाहरण संकलक त्रुटि उत्पन्न करना चाहिए, और क्यों। मैं दृष्टिकोण का वर्णन करने के लिए बस इसका उपयोग कर रहा हूं, धन्यवाद। वह नया नहीं: <) –

उत्तर

6

Convert.ChangeType किनारे के मामलों को संभालना चाहिए; यह IConvertible पर प्रतिनिधि करता है।

प्रश्न का उत्तर देने के लिए, संकलक को पता नहीं है कि Tstring है।
इसलिए, यह आपको असंबंधित प्रकारों के बीच नहीं डालने देता है (जैसे कि आप ButtonTextBox पर नहीं डाल सकते हैं)।

आप के आसपास काम कर सकते हैं कि object पहले कास्ट कर:

return (T)(object)o.ToString(); 

अब, प्रत्येक व्यक्ति के रूपांतरण संकलक (यह या तो एक सीधा Upcast या एक सीधे खिन्न है) द्वारा अनुमति दी है, और आप पूरी जानते हैं कि चीज काम करेगी क्योंकि TString है।

+0

क्यों बिल्ली ने मुझे इस बारे में नहीं सोचा? चलो देखते हैं कि हर कोई क्या कहता है, लेकिन यह स्वीकार्य उत्तर भी हो सकता है। –

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