2013-08-13 3 views
5

मैं इस तरह एक बयान कुछ है। ऐसा इसलिए है क्योंकि दो परियोजनाएं एक ही सेवा संदर्भ से समान कक्षाएं बना रही हैं। डेटासोर्स एक नामस्थान को इंगित करता है और MyClass कास्ट एक अलग नाम से है। (यह समझाने के लिए जटिल है कि यह कैसे हुआ)किसी ऑब्जेक्ट को किसी प्रकार पर कैसे डाला जाए जब रनटाइम के दौरान टाइप किया जाता है? <code>MyClass myClass = report.DataSource as MyClass</code></p> <p>रनटाइम के दौरान, डेटा स्रोत के प्रकार MyClass है लेकिन यह वर्तमान चल रहा है परियोजना से एक अलग नाम स्थान में है:

रनटाइम के दौरान, मैं रिपोर्ट से लौटाए गए प्रकार का उपयोग कैसे करूं। डेटासोर्स.गेट टाइप() (किसी अन्य नामस्थान से MyClass लौटाता है) और इसे 'MyClass' के बजाय टाइप कास्ट के रूप में उपयोग करें। नामस्थान में है जो मैं नहीं चाहता?

(मुझे आशा है कि मैं यह स्पष्ट रूप से व्याख्या की है। मेरे दिमाग अब धूमिल है!)

+2

यदि आप अपनी माईक्लास परिभाषा को अपनी सेवा और ग्राहकों द्वारा साझा की गई एक अलग असेंबली में खींचते हैं, तो सेवा संदर्भ जेनरेटर मौजूदा कक्षा का पुन: उपयोग करेगा और चीजों को आपके लिए अधिक आसान बना देगा। –

+1

क्या आप जेनिक्स का उपयोग कर सकते हैं? – TylerOhlsen

+0

+1 माइकल - जब आप टिप्पणी कर रहे थे तो मैं इसे टाइप कर रहा था! – lesscode

उत्तर

0

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

2

दुर्भाग्य से, यह सिर्फ नहीं है कि अपनी "एक अलग नाम स्थान में एक ही कक्षा" ... मूल रूप से, आप 2 श्रेणियां होती हैं । ऑटो जेनरेट कोड के कारण वे पूरी तरह अलग वर्ग हैं।

जहां तक ​​नेट रनटाइम का संबंध है, वे भी "int" और "स्ट्रिंग" के रूप में अलग हो सकते हैं। वे शायद विभिन्न असेंबली से भी जय हो।

मेरे पास भी इसी तरह की समस्या है - और इस बिंदु पर, शायद आप सबसे आसान काम कर सकते हैं जो आपकी खुद की जेनेरिक कनवर्टर विधि है जो एक प्रकार से सार्वजनिक गुणों को पढ़ेगा, और उन्हें दूसरे पर पॉप्युलेट करेगा प्रकार।

यह किया जा सकता है क्योंकि आप वादा कि दो वर्गों समान :) देखने

+2

यदि आप रूपांतरण करने में मदद करने के लिए कुछ चाहते हैं, तो [ऑटोमैपर] (https://github.com/AutoMapper/AutoMapper) देखें, खासकर यदि आपके पास इन कक्षाओं में से बहुत से स्थानांतरण स्थानांतरित हैं। –

0

अनिवार्य रूप से क्या आप कहा जाता है "बतख टाइपिंग" चाहते हैं। आप इसे Castle DynamicProxy का उपयोग करके कर सकते हैं और here का एक अच्छा उदाहरण ढूंढ सकते हैं।

0

मुझे यकीन है कि मैं स्पष्ट रूप से आपकी समस्या समझ में आ नहीं कर रहा हूँ, लेकिन यहाँ यह जाता है

अपने वर्ग फ़ाइल के शीर्ष पर उन वर्गों के लिए using बयान न रखें - इस तरह से आप उन्हें हमेशा संदर्भ जाएगा पूरा नाम स्थान का उपयोग कर ।

बाद में यह काफी आसान है, जहाँ तक मैं

MyClass myClass = report.DataSource as MyClass 
if(myClass==null) 
    //do the second conversion 

समझ में आ रहा है नाम स्थान पूरी तरह से (या आंशिक रूप से) जब वर्ग

  • संदर्भित दो

    1. global:: कीवर्ड से एक का उपयोग टकरा हैं extern alias एक या दोनों आपकी असेंबली जिनमें MyClass
    है

    यदि आप एक कक्षा को दूसरे में परिवर्तित करना चाहते हैं तो अपने कस्टम कनवर्टर को कार्यान्वित करें।

  • 1

    यदि मैं आपके प्रश्न को सही ढंग से समझता हूं, तो आपके पास दो परियोजनाएं हैं जो एक ही सेवा का संदर्भ देती हैं (उसी संदर्भ में सेवा संदर्भ जोड़ें)। वह सेवा डेटाकंट्रैक्ट ऑब्जेक्ट देता है। आपके पास अन्य परियोजनाओं में से एक का संदर्भ है, और सेवा के डेटाकंट्रैक्ट के लिए अन्य प्रोजेक्ट की जेनरेट प्रॉक्सी का उपयोग करना है।

    जैसा कि अन्य ने इंगित किया है, डिफ़ॉल्ट रूप से डेटाकंट्रैक्ट के लिए उत्पन्न प्रॉक्सी प्रकार दो अलग-अलग, असंगत प्रकारों का प्रतिनिधित्व करेंगे।

    हालांकि, यदि आप क्लाइंट और सर्वर दोनों पर .NET मानने में सक्षम हैं, तो आप डेटाकंट्रैक्ट प्रकार को अपनी स्वयं की असेंबली में परिभाषित कर सकते हैं जिसे अन्य तीन परियोजनाओं - सेवा पुस्तकालय और दो क्लाइंट परियोजनाओं द्वारा संदर्भित किया गया है । वैसे भी ऐसा करने के लिए यह सामान्य अभ्यास है।

    फिर आप आम असेंबली में प्रकारों का पुन: उपयोग करने के लिए क्लाइंट प्रॉक्सी (सेवा संदर्भ -> उन्नत जोड़ें) की पीढ़ी को कॉन्फ़िगर कर सकते हैं।

    अब दो क्लाइंट प्रोजेक्ट्स द्वारा साझा किए गए डेटाकंट्रैक्ट के लिए केवल एक ही प्रकार होगा।

    0

    यह आपके उद्देश्य के लिए उपयुक्त नहीं हो सकता है, लेकिन पूरा होने के लिए, मैं आपके लिए उपलब्ध संकलन-समय विकल्प का उल्लेख करता हूं: इंटरफेस।

    यदि आप एक असेंबली में एक इंटरफ़ेस बनाते हैं जो CAN संकलित समय पर साझा किया जा सकता है, तो आप किसी भी समय उस इंटरफ़ेस पर जा सकते हैं।

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

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