2016-09-15 7 views
7

मेरे पास कुछ कोड है जिसका मेरा कोई नियंत्रण नहीं है। एक कस्टम वर्ग MyClass (KnownType से प्राप्त नहीं) के रूप में पारित किया जा सकता है कि डिजाइन करने के लिए सी # मेंसी # कास्ट ऑपरेटर के माध्यम से गतिशील रूपांतरण

KnownType item = (KnownType) parameter; 

क्या यह संभव है: यह कोड एक वस्तु पैरामीटर स्वीकार करता है और एक प्रकार इस तरह संकलन समय पर जाना जाता है के लिए यह कास्ट करने के लिए प्रयास करता है उपरोक्त कोड और इसके बाद के संस्करण कोड से KnownType में बदला जाने वाला पैरामीटर है, बशर्ते कि MyClass अपने सदस्य पद्धति का उपयोग करके KnownType को ही परिवर्तित कर सकते हैं:

protected KnownType ConvertToKnownType() 
{ 
    // conversion code goes here 
} 

मैं इस तरह एक कस्टम रूपांतरण ऑपरेटर को लागू करने की कोशिश की है:

public static implicit operator KnownType(MyClass source) 
{ 
    KnownType result; 
    // conversion goes here 
    return result; 
} 

लेकिन यह काम नहीं किया (इसका उपयोग नहीं किया गया था)। क्या मुझे लगता है कि कास्ट ऑपरेटर केवल तभी काम करता है जब स्रोत प्रकार, लक्ष्य प्रकार और रूपांतरण ऑपरेटर संकलन समय पर ज्ञात हैं?

संपादित करें: मैंने शुरुआत में रूपांतरण करने वाले कोड के बारे में अधिक जानकारी प्रदान नहीं की क्योंकि मुझे लगता है कि यह अप्रासंगिक है और क्योंकि मुख्य रूप से कास्ट ऑपरेटर लागू करने के तरीके में दिलचस्पी है, यानी यह रनटाइम को देखता है उपयुक्त कनवर्टर खोजने के लिए टाइप करें या संकलन समय पर निर्णय लिया गया है?

चीजों को साफ करने के लिए, KnownType, वास्तव DataRowView में है, जबकि MyClass कुछ अन्य प्रकार से निकाले जाते हैं नहीं है DataRowView के लिए एक आवरण वर्ग है। MyClassDataRowView का संदर्भ रखता है। ComboBox.DataSource को DataView पर बाध्य करने के बजाय, मैं इसे IList<MyClass> पर बांधता हूं लेकिन मुझे की आवश्यकता है ताकि DataRowView कॉलम मानों तक पहुंचने में सक्षम हो जैसे कि मैं IList<DataRowView> बाध्यकारी था। दुर्भाग्यवश कास्ट ऑपरेटर जिस तरह से डरता था, वह काम करता है: यह केवल रूपांतरण करने के लिए समयबद्ध जानकारी संकलित करता है (हालांकि यह समान विरासत के पेड़ में प्रकारों के बीच कास्टिंग करते समय रनटाइम प्रकार की जानकारी का उपयोग करता है)।

+1

आप एक ऐसे फ़ंक्शन के साथ 'मायटाइप' क्यों नहीं बनाते हैं जो 'माईटाइप' उदाहरण के गुणों के आधार पर निर्मित 'ज्ञात टाइप' का उदाहरण देता है? आप फिर 'ज्ञात टाइप' की अपेक्षा करने वाले फ़ंक्शन में 'myType.ToKnownType()' को पास कर सकते हैं। – xxbbcc

+0

@xxbbcc उन्होंने कहा कि उनके पास रूपांतरण करने वाले वर्ग पर नियंत्रण नहीं है। – Servy

+0

यह इस बात पर निर्भर करता है कि आपके द्वारा पारित ऑब्जेक्ट को जांचने के लिए कोड क्या कर रहा है। यह स्पष्ट रूप से जांच कर सकता है कि ऑब्जेक्ट सटीक प्रकार है, और यहां तक ​​कि कोई भी जो विरासत में नहीं है। – DavidG

उत्तर

6

नहीं, यह संभव नहीं है। प्रदान की गई कास्ट केवल सफल होगी यदि आप उस कक्षा से अपनी कक्षा प्राप्त करने में सक्षम हैं। विरासत के आधार पर किसी प्रकार का रूपांतरण नहीं करने के लिए कक्षा को रूपांतरण करने के लिए कुछ भी करने के लिए रूपांतरण करने की आवश्यकता होगी।

क्या मुझे लगता है कि कास्ट ऑपरेटर केवल तभी काम करता है जब स्रोत प्रकार, लक्ष्य प्रकार और रूपांतरण ऑपरेटर संकलन समय पर ज्ञात होते हैं?

हां।

+0

ध्यान दें कि यदि 'ज्ञात टाइप' एक * इंटरफ़ेस * (या 'मार्शलबीरफॉबब्जेक्ट'' से प्राप्त एक प्रकार है, तो आप 'पैरामीटर' के रूप में एक पारदर्शी प्रॉक्सी प्रदान करके एक कस्टम रूपांतरण फ़ंक्शन को कॉल करने के लिए रनटाइम को ट्रिक कर सकते हैं (जिसे आप एक के साथ प्राप्त कर सकते हैं 'RealProxy' कार्यान्वयन)। –

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