2012-08-24 14 views
5

मेरे पास 2 प्रकार हैं: BaseQuestion और QuestionQuestionBaseQuestion से कुछ गुण प्राप्त करता है। अब मैंने BaseQuestion उपलब्ध कराने के लिए एक वेब एपीआई बनाया है। Question डेटाटाइप में अतिरिक्त गुण हैं जिन्हें मैं उपलब्ध नहीं करना चाहता हूं। मेरे पास एक तरीका है जो Question पुनर्प्राप्त करता है और मेरी प्रारंभिक योजना को केवल BaseQuestion पर स्पष्ट रूप से अपनाना था। मैंने सोचा कि यह उन सभी अतिरिक्त संपत्तियों को खो देगा जिन्हें मैं सुलभ बनाना नहीं चाहता हूं और मैं इसे वापस कर सकता हूं। अच्छा, यह नहीं है। यह वही है जो मैं करता हूं:सी #: सुपरक्लास के पास अभी भी उपशीर्षक की जानकारी है

Question q = allQuestions[0]; 
BaseQuestion bq = q; 
string type = bq.GetType().ToString(); 

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

किसी भी विचार पर मैं BaseQuestion टाइप करने के लिए "बल" कैसे कर सकता हूं और उप-वर्ग में परिभाषित कोई गुण नहीं है?

+0

चर BQ के प्रकार BaseQuestion है। ऑब्जेक्ट का रनटाइम प्रकार जिसे बीक संदर्भित करता है वह प्रश्न है। निश्चित नहीं है कि "बल बीक्यू को बेस क्वेस्टियन टाइप करने के लिए" क्या मतलब है।आप केवल वर्चुअल बीक के माध्यम से बेस क्वेस्टियन सदस्यों तक पहुंच पाएंगे। – lesscode

+1

मुझे लगता है कि आपका भ्रम यह समझ में नहीं आता है कि आपने जो कुछ दिया है वह ** संदर्भ ** स्मृति में वस्तुओं के लिए है। –

+0

साइमन, अच्छा बिंदु। तो मुझे दोबारा दोहराएं: मैं प्रकार का एक नया ऑब्जेक्ट कैसे बना सकता हूं प्रश्न और स्वचालित रूप से सभी संपत्ति मूल्यों की प्रतिलिपि बना सकता हूं? स्वचालित रूप से मेरा मतलब है कि मैं ** ** इसे लागू नहीं करना चाहता हूं। IMHO यह परिदृश्य मेरी स्थिति के लिए बिल्कुल अद्वितीय नहीं है और इसे .NET द्वारा कवर किया जाना चाहिए। – Jan

उत्तर

11

टाइपकास्टिंग वस्तु की प्रकृति को नहीं बदलता है, यह केवल वस्तु के आपके दृश्य को बदलता है। जब आप बेस प्रकार पर टाइपकास्ट करते हैं, तो आप उस ऑब्जेक्ट को फ़िल्टर के माध्यम से देख रहे हैं जो मूल वस्तु में परिभाषित सदस्यों को देख सकता है, भले ही वास्तविक वस्तु में जो कुछ भी परिभाषित किया गया हो।

जब आप किसी वेब सेवा कॉल से ऑब्जेक्ट वापस करते हैं, तो यह वास्तविक वस्तु है जिसे क्रमबद्ध किया जाएगा और तार के पार वापस भेजा जाएगा - इसके सभी धारावाहिक सदस्यों।

एक तकनीक जिसे आप व्युत्पन्न प्रश्न वर्ग के सदस्यों को एपीआई कॉलर में वापस आने से रोकने के लिए उपयोग कर सकते हैं, प्रश्न वर्ग में घोषित सदस्यों के क्रमबद्धीकरण को दबाने के लिए है। .NET में कई क्रमिक उपप्रणालीएं हैं, लेकिन यदि आप XmlSerialization का उपयोग कर रहे हैं तो आप XmlSerialization द्वारा क्रमबद्ध होने से रोकने के लिए [XmlIgnore] विशेषताओं के साथ प्रश्न वर्ग में घोषित सदस्यों को सजाने के लिए तैयार करेंगे। यदि आप एक अलग सीरियलाइजेशन उपप्रणाली का उपयोग कर रहे हैं तो आपको उस प्रणाली के एनालॉग को समझने की आवश्यकता होगी।

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

यदि अन्य सभी विफल हो जाते हैं, तो ब्रूट फोर्स समाधान एक temp var में आपके बेस क्वेस्टियन का एक उदाहरण बनाना है, वास्तविक गुण वस्तु से संबंधित गुणों को अस्थायी वस्तु से कॉपी करें, और अस्थायी वस्तु को वापस करें। यह अशिष्ट और कच्चा है और एक बेहतर तरीका होना चाहिए, लेकिन यह काम करेगा।

+0

मैं प्रश्न/बेस क्वेस्टियन प्रकार नहीं बदल सकता क्योंकि वेब एपीआई उनका एकमात्र उपयोगकर्ता नहीं है। मैं पूरी तरह से सहमत हूं कि "एक बेहतर तरीका होना चाहिए" भाग, और मैं पूरी जगह पर देख रहा हूं लेकिन खाली हो गया। मुझे लगता है कि मेरी निराशा एक स्पष्ट कनवर्टर बनाने के लिए काफी बड़ी है। लेकिन मदद के लिए धन्यवाद! – Jan

+0

इंटरफ़ेस विरासत के आधार पर क्रमबद्धता को सीमित करने के हिस्से को छोड़कर, इनमें से अधिकतर उत्तर सही है। वह हिस्सा काम नहीं करता है क्योंकि यह मूल वस्तु को नहीं बदलता है। मेरी इच्छा है कि यह इस तरह काम करे :( –

+0

"अनुबंध इंटरफ़ेस" बनाने के बजाय, जो कुछ भी आप क्रमबद्ध करना चाहते हैं और deserialize के "अनुबंध मॉडल" बनाएं। रूपांतरण कार्यों को लिखें या लाइब्रेरी का उपयोग करें जैसे [ऑटोमैपर] (https: // github.com/AutoMapper/AutoMapper) अपने "पूर्ण" मॉडल को स्लिम-डाउन संस्करण में कनवर्ट करने के लिए जिसमें केवल उन गुणों को शामिल किया गया है जिन्हें आप क्रमबद्ध करना चाहते हैं। – MarioDS

1

टाइपकास्टिंग केवल ऑब्जेक्ट के संदर्भ के प्रकार को बदलता है, ऑब्जेक्ट स्वयं ही नहीं।

.GetType()Question के उदाहरण पर Question प्रकार को हमेशा संदर्भित करने वाले चर प्रकार के बावजूद Question प्रकार वापस कर देगा।

यदि आप मूल प्रकार चाहते हैं तो आपको प्रकार पर .BaseType संपत्ति पर कॉल करने की आवश्यकता है।

तो, कुछ इस तरह:

string type = q.GetType().BaseType.ToString(); 
+0

यह केवल दिखाने के लिए था कि मेरा क्या मतलब है। मुझे एक ऑब्जेक्ट होना चाहिए जिसमें _only_ शामिल है बेस क्लास के गुण – Jan

+0

क्या यह नहीं है कि 'बेस क्वेस्टियन' के लिए किस प्रकार का कास्टिंग आपको दिया जाएगा? – Enigmativity

+0

यही मैंने सोचा था, लेकिन स्पष्ट रूप से यह नहीं है। मैं ऑब्जेक्ट को स्वयं नहीं बदलता, मैं केवल कंटेनर I स्टोर को बदलता हूं संदर्भ में। उपclass के गुण अभी भी वहाँ हैं और serialized मिल जाएगा। – Jan

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