2013-05-06 17 views
6
[DataContract] 
public class SearchCriteria 
{ 
    [DataMember] 
    public string CountryID { get; set; }  
} 

[DataContract] 
public class CitySearchCriteria: SearchCriteria 
{ 
    [DataMember] 
    public string CityID { get; set; } 
} 

मैं अपने MVC नियंत्रक कार्रवाई में SearchCriteria का उदाहरण बनाकर रहा हूँ, और करने की कोशिश कर यह CitySearchCriteria में परिवर्तित करने के आधार वर्ग (डेटा अनुबंध) कास्ट करने में असमर्थ।व्युत्पन्न वर्ग

SearchCriteria searchCriteria = new SearchCriteria(); 
searchCriteria.CountryID = "1"; 
CitySearchCriteria citySearchCriteria = searchCriteria as CitySearchCriteria; 

उपर्युक्त कथन के बाद "सिटीशर्चक्रिटिया" ऑब्जेक्ट न्यूल मान दिखा रहा है। मैं उम्मीद कर रहा था कि यह दोनों संपत्तियों, कंट्रीआईडी ​​और सिटीआईडी ​​को देश आईडी के साथ, और सिटीआईडी ​​रिक्त स्थान दिखाए ... लेकिन यह ऑब्जेक्ट को न्यूल पर सेट कर रहा है।

यहां समाधान क्या हो सकता है? क्या डेटाकंट्रैक्ट इस के साथ कुछ करने के लिए है?

टिप्पणियां सुझाव दे रहे हैं, तो आप प्राप्त करने के लिए एक आधार परिवर्तित नहीं कर सकते: , लेकिन वास्तव में, मैं मेरे विचार में सफलतापूर्वक किया है, इसकी सिर्फ नियंत्रक कार्रवाई में काम नहीं कर रहा:

CitySearchCriteria citySearchCriteria = (CitySearchCriteria)Model.SearchCriteria; 

यह सफलतापूर्वक परिवर्तित किया जाता है, तो नियंत्रक कार्रवाई में काम करने वाली समान चीज़ क्यों नहीं?

+0

आप बेस से व्युत्पन्न तक नहीं डाले जा सकते हैं। उलटा संभव है – noobob

+0

कृपया – Nirman

+0

प्रश्न में अंतिम दो अनुच्छेद देखें, फिर से मार्टिन का उत्तर (पहला उदाहरण) देखें। – noobob

उत्तर

5

प्रत्येक व्यक्ति ने पहले से ही (और सही तरीके से) आपको बताया है कि आप बस बेस से व्युत्पन्न नहीं जा सकते हैं, लेकिन ऐसा लगता है कि आपको अभी भी यह कारण नहीं मिला है कि यह लाइन आपके कोड के किसी अन्य हिस्से में क्यों काम करती है:

CitySearchCriteria citySearchCriteria = (CitySearchCriteria)Model.SearchCriteria; 

मुझे लगता है कि आप एक छोटा सा क्या एक उदाहरण के "प्रकार" है के बारे में उलझन में हैं। आप मॉडल की परिभाषा पोस्ट नहीं किया, लेकिन मुझे लगता है कि आप कुछ इस तरह है:

public SearchCriteria SearchCriteria; 

इसका मतलब यह नहीं है कि SearchCriteria हमेशा SearchCriteria के उदाहरण में शामिल है, लेकिन केवल कि यह प्रकार के उदाहरण हों, जो कर सकते हैं SearchCriteria पर डाला जा सकता है। आपके मामले में इसमें SearchCriteria या CitySearchCriteria के उदाहरण शामिल हो सकते हैं। मुझे लगता है कि आपके कोड में कहीं आपको कुछ ऐसा मिलेगा:

Model.SearchCriteria = new CitySearchCriteria(); 

और यह वही है जो यार्ड को सही ढंग से निष्पादित करने की अनुमति देता है। आप देख सकते हैं कि उदाहरण वास्तव में एक CitySearchCriteria है (और नहीं बस SearchCriteria का एक उदाहरण) इस कोड को क्रियान्वित सिर्फ कलाकारों से पहले:

MessageBox.Show(Model.SearchCriteria.GetType().FullName; 

बेहतर समझने के लिए तुम सिर्फ अपने काम से पहले SearchCriteria में मूल्य को संशोधित करने की कोशिश कर सकते नीचे दिखाए गए अनुसार यह पता लगाने के लिए कि कास्ट अब और काम नहीं करेगा:

Model.SearchCriteria = new SearchCriteria(); 
MessageBox.Show(Model.SearchCriteria.GetType().FullName; 
CitySearchCriteria citySearchCriteria = (CitySearchCriteria)Model.SearchCriteria; 
+0

धन्यवाद, हाँ, आप सही हैं, मुझे इस पर बहुत भ्रम था। इन विवरणों ने इसे स्पष्ट किया है, और मैं देख सकता हूं कि कोडिंग में मैं कहां गलत हूं। धन्यवाद – Nirman

6

आप इस तरह से नहीं डाले जा सकते हैं!

यदि आप new करते हैं तो आप एक निश्चित आकार की एक नई मेमोरी ऑब्जेक्ट बनाते हैं। आपके मामले में new SearchCriteria() एक स्ट्रिंग को पकड़ने के लिए पर्याप्त आकार के साथ एक नई मेमोरी ऑब्जेक्ट बनाता है, और कुछ नहीं, कुछ भी कम नहीं।

अपनी आखिरी पंक्ति में आप searchCriteria as CitySearchCriteriasearchCriteria में ऑब्जेक्ट को बड़े प्रकार के CitySearchCriteria में डालने का प्रयास कर रहे हैं। लेकिन यह नहीं किया जा सकता है। आप एक मेमोरी ऑब्जेक्ट को 'कन्वर्ट' करने की कोशिश कर रहे हैं जिसमें 1 स्ट्रिंग मेमोरी ऑब्जेक्ट में है जो 2 स्ट्रिंग्स रख सकती है। लेकिन कास्टिंग एक नई स्मृति वस्तु को परिवर्तित नहीं करता है। नई स्ट्रिंग का मूल्य क्या होगा? यह जांचने के लिए पानी के नीचे आता है कि आपका संदर्भ searchCriteria में पहले से ही CitySearchCriteria प्रकार का ऑब्जेक्ट है या नहीं। आपके मामले में: यह नहीं है (ऑब्जेक्ट SearchCriteria प्रकार है) और null देता है।

तो ... अगला उदाहरण काम करता है (क्योंकि CitySearchCriteria पहले ही बनाया जा चुका है)। यह भी अपने समाधान है:

SearchCriteria searchCriteria = new CitySearchCriteria(); 
CitySearchCriteria citySearchCriteria = searchCriteria as CitySearchCriteria; 

और यह काम नहीं करता है (क्योंकि CitySearchCriteria नहीं पहले से ही बनाया गया है)।

SearchCriteria searchCriteria = new SearchCriteria(); 
CitySearchCriteria citySearchCriteria = searchCriteria as CitySearchCriteria; 

यह अगले उदाहरण के रूप में एक ही बात है: यह अपनी स्थिति है।
यह काम (क्योंकि SearchCriteria पहले से ही बनाया गया है) करता है:

object o = new SearchCriteria(); 
SearchCriteria searchCriteria = o as SearchCriteria; 

और यह करता है नहीं (क्योंकि SearchCriteria नहीं पहले से ही बनाया गया है) ::

object o = new object(); 
SearchCriteria searchCriteria = o as SearchCriteria; 

के लिए रिकॉर्ड: मैं हमेशा as का उपयोग करके एक कास्ट का उपयोग नहीं करता, जब तक कि आप स्पष्ट रूप से परीक्षण नहीं करना चाहते हैं कि कोई ऑब्जेक्ट उस प्रकार का है या नहीं।

+0

इसे परिवर्तित नहीं किया जा सकता है क्योंकि, उसके कार्यान्वयन के आधार पर, कास्ट बेस क्लास से व्युत्पन्न तक काम नहीं करेगा। उलटा संभव है। – noobob

+0

मुझे लगता है कि मैंने यही कहा है ... है ना? या क्या मैं तुम्हारा मतलब याद कर रहा हूँ? मेरे पाठ में क्या उदाहरण सही नहीं है? –

+0

@noobob: कौन सा गलत है? –

2

आप सिटीशर्च क्राइटरिया बना सकते हैं, और इसे सर्चक्रिटिया में डाल सकते हैं। इस तरह आप केवल देश आईडी देख सकते हैं। बाद में, आप इसे वापस सिटीशर्च क्राइटरिया में डाल सकते हैं, और देश आईडी और सिटीआईडी ​​देखेंगे।

इसका डेटाकंट्रैक्ट से कोई लेना देना नहीं है। आपके मामले में समाधान सिटीशर्च क्राइटरिया बनाना होगा और इसे सर्चक्रिटिया में डालना होगा (यदि आपको इसकी आवश्यकता है)।

+0

मुझे दो समान प्रश्न मिले: http://stackoverflow.com/questions/988658/unable-to-cast-from-parent-class-to-child-class और http://stackoverflow.com/questions/ 9885644/cast-the-parent-object-to-child-object-in-c-sharp – uross

+0

बात यह है कि, मेरा विचार "सर्चक्रिटिया" ऑब्जेक्ट की अपेक्षा कर रहा है क्योंकि इसे कई स्थानों से बुलाया गया है, जिसमें "सिटीशर्च क्राइटरिया" हो सकता है , कॉलिंग कंट्रोलर और एक्शन के आधार पर, "स्टेटशर्च क्राइटरिया" आदि। साथ ही, मैंने अपने विचारों के अंदर सफलतापूर्वक यह किया है, जैसे, सिटीशर्च क्राइटरिया शहर सर्चक्रिटिरिया = (सिटीशर्च क्राइटरिया) मॉडल। सर्चक्रिटिया; और यह ठीक काम कर रहा है, तो नियंत्रक कार्रवाई में क्यों नहीं? – Nirman

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