2010-07-04 13 views
7

से प्राप्त कक्षा में जेनेरिक सूची का कास्टिंग मैंने सूची से व्युत्पन्न कक्षा बनाई है। हालांकि जब मैंने क्लास को किसी अन्य सूची ऑब्जेक्ट में कास्ट करने का प्रयास किया तो मुझे रनटाइम त्रुटि मिल गई। मेरा कोड नीचे पोस्ट किए गए एक जैसा है:सूची

public class CategoryObj 
{ 
    public int CategoryID { get; set; } 
    public string CategoryName { get; set; } 
    public string Description { get; set; } 
} 

public class CategoryObjCollection:List<CategoryObj> 
{ 

} 

public void Test() 
{ 
     CategoryObjCollection cat = new CategoryObjCollection(); 
     using (NWDataContext db = new NWDataContext()) 
     { 
      var qry = (from c in db.Categories 
         select new CategoryObj 
         { 
          CategoryID = c.CategoryID, 
          CategoryName = c.CategoryName, 
          Description = c.Description 
         }).ToList(); 
      cat = (CategoryObjCollection)qry; //runtime error Unable to cast object of type 'System.Collections.Generic.List`1[WindowsFormsApplication1.CategoryObj]' to type 'WindowsFormsApplication1.CategoryObjCollection'. 
     } 
} 

मुझे उम्मीद है कि कोई इस पर मेरी सहायता कर सकता है। धन्यवाद।

उत्तर

6

इस

public class CategoryObjCollection:List<CategoryObj> 
{ 
    public CategoryObjCollection(IEnumerable<CategoryObj> items) : base(items){} 
} 


cat = new CategoryObjCollection(qry); 
12

क्यों कास्ट किए जाने में सक्षम होने की उम्मीद कर सकते हैं की कोशिश? ऑब्जेक्ट CategoryObjCollection का उदाहरण नहीं है। संदर्भ प्रकार का बिंदु (जब वे वास्तव में स्पष्ट रूपांतरणों का आह्वान करने के बजाए कास्टिंग कर रहे हैं) को संकलित करना है कि आपको लगता है कि निष्पादन समय ऑब्जेक्ट का प्रकार वास्तव में आपके द्वारा निर्दिष्ट प्रकार के साथ संगत है, ताकि आप इसका उपयोग कर सकें उस विशिष्ट प्रकार के सदस्य (निष्पादन समय परीक्षण के बाद)। इस मामले में, ToList विस्तार विधि बस एक नया List<T> बनाता है।

बिंदु पर और अधिक, CategoryObjCollection प्रकार पहले स्थान पर प्राप्त करने के लिए क्या है? यदि इसकी सामान्य सूची के अलावा कोई अन्य राज्य है, तो आप अपनी LINQ क्वेरी के बाद उस राज्य से कहां से आने की उम्मीद करेंगे? यदि उसके पास कोई अन्य राज्य नहीं है, तो क्या यह वास्तव में कोई लाभ जोड़ रहा है? हो सकता है कि आपके प्रकार को वास्तव में में से निकालने की बजाय एक सूची होनी चाहिए? फिर आप क्वेरी के परिणामों का उपयोग कर प्रकार का एक नया उदाहरण बना सकते हैं।

सामान्यतः, यह आमतौर पर List<T> से प्राप्त करने के लिए एक डिज़ाइन गंध है। यह अपनी "सूची" को विशेषज्ञता देने के कई तरीकों को प्रदान नहीं करता है (विपरीत, कहें, Collection<T>)। यह आमतौर पर एक संकेत है कि आपको विरासत की बजाय संरचना के बारे में सोचना चाहिए।

+0

मुझे लगता है कि वह एक सी ++ करने की कोशिश कर रहा है - जैसे टाइपिफ उपनाम। –

+0

@ जारोस्लाव: काफी संभवतः - लेकिन यह विरासत नहीं है, और यह नहीं है कि इसका उपयोग किसके लिए किया जाना चाहिए। वास्तव में –

+0

। यही है 'उपयोग' निर्देश के लिए है। –

3

कलाकार केवल तभी काम करेगा जब आपने एक रूपांतरण ऑपरेटर लागू किया हो। लेकिन यह एक बहुत ही प्रभावी दृष्टिकोण नहीं है।

क्या आप एक प्रकार उपनाम बनाने की कोशिश कर रहे हैं (जैसे सी ++ टाइपपीफ)?

using CategoryObjCollection = System.Collections.Generic.List<myNamespace.CategoryObj>; 

अब आप स्वतंत्र रूप से CategoryObjCollection और List<CategoryObj> (जो एक ही प्रकार है के बीच में बदल सकते हैं - केवल अलग नाम

मैं भी एक अलग विधि का प्रयोग करेंगे सूची को भरने के लिए:।

db.Categories.ForEach(c => 
    cat.Add(new CategoryObj() 
     { 
      CategoryID = c.CategoryID, 
      CategoryName = c.CategoryName, 
      Description = c.Description 
     })); 
0

आप कास्टिंग क्यों कर रहे हैं? आपको वास्तव में कास्टिंग नहीं किया जाना चाहिए .... बस qry पर एक लूप जोड़ें और अपनी cat सूची भरें।