2009-05-05 42 views
5

मैं एक वस्तु है कि कुछ इस तरह दिखता का निर्माण करने की कोशिश कर रहा हूँ करने के लिए सूची deserialize कैसे करें:Enumerable.ToList <>() <>

public class MyObject 
    { 
    private IList<AnotherObject> items; 
    public List<AnotherObject> Items 
    { 
     return items.AsEnumerable().ToList<AnotherObject>(); 
    } 
    } 

मैं अपने दाल के रूप में NHibernate का उपयोग कर रहा है और यह मानचित्रण है सीधे आइटम फ़ील्ड और जो ठीक काम करता है।

मैं विंडोज वर्कफ़्लो का भी उपयोग कर रहा हूं और प्रतिलिपि गतिविधि सामान्य जेलीस्ट के साथ काम नहीं करती है। (http://social.msdn.microsoft.com/Forums/en-US/windowsworkflowfoundation/thread/2ca74b60-fd33-4031-be4b-17a79e9afe63) यह मूल रूप से मुझे IList <> के बजाय सूची <> रैपर का उपयोग करने के लिए मजबूर कर रहा है। यह निश्चित रूप से प्रत्यक्ष एनएचबीर्नेट मैपिंग को तोड़ता है क्योंकि एनएचबीर्नेट के आईएलआईस्ट कार्यान्वयन को सीधे सूची में नहीं डाला जा सकता है।

** संपादित करें: विंडोज वर्कफ़्लो आवश्यकता वास्तव में इसका मतलब है कि मैं सूची में टाइप-सुरक्षित पहुंच खोने जा रहा हूं इससे कोई फर्क नहीं पड़ता कि इसे एक आईएलआईस्ट की आवश्यकता है।

अब लक्ष्य इस ऑब्जेक्ट को क्रमबद्ध/deserialize करना है। यह द्विआधारी क्रमिकरण के साथ ठीक काम करता है लेकिन अंतर्निहित एनएचबेर्नेट प्रॉक्सी ऑब्जेक्ट्स निषेध त्रुटियों के साथ विस्फोट करते हैं जब मैं उन्हें deserialize करने की कोशिश करता हूं।

तो मैंने एक्सएमएल क्रमबद्ध करने की कोशिश की। सीरियलाइजेशन ठीक काम करता है और मुझे सीरियलाइज्ड एक्सएमएल फाइल में मेरी अच्छी ठोस वर्ग परिभाषा देता है जो पूरी तरह से निबर्ननेट प्रॉक्सी को बाहर निकाल देता है। हालांकि, जब इसे deserialize करने का प्रयास, मैं आइटम के रूप में सूची में आइटम जोड़ने में असमर्थ हूं। अनन्य। सूची कॉल आइटम के माध्यम से अंतर्निहित सूची में जोड़ा जाने नहीं देगा। विधि विधि।

क्या किसी के पास इस पर कोई विचार है? क्या मैं इस बारे में गलत तरीके से जा रहा हूं?

** संपादित करें: एनएचबीर्नेट कंक्रीट क्लास NHibernate.Collection.Generic.PersistentGenericBag जो वास्तव में सीधे IList को लागू करता है। हालांकि, मैंने जेनेरिक सूची के सभी प्रकार के सुरक्षित लाभ खो दिए। यह मुझे प्रत्येक बच्चे के ऑब्जेक्ट के लिए एक रैपर लिखने के दायरे में वापस रखता है और यदि संभव हो तो मैं वास्तव में इससे बचना चाहता था।

उत्तर

2

विकल्प पर अपनी खुद की CustomList कार्यान्वयन एक उदाहरण है कि IList

यानी लागू करता है के आसपास आवरण है कि बनाने के लिए है।

ऐसा लगता है कि आपकी कक्षा IList के साथ-साथ IList<T> लागू होती है, तो आप ठीक होंगे।

+0

मैं रैपर मार्ग पर विचार कर रहा हूं लेकिन मैं वास्तव में अपने डोमेन मॉडल में प्रत्येक बच्चे के ऑब्जेक्ट के लिए एक रैपर लिखना नहीं चाहता था। तब जेनेरिक का मुद्दा क्या है? :) मैं मानता हूं कि यह शायद आखिरी उपाय समाधान है। –

+0

वर्तमान समाधान के साथ मैं काम कर रहा हूं एक रैपर वर्ग है जो IList और IList दोनों लागू करता है। टाइप-चेकिंग करने के लिए गैर-जेनेरिक तरीकों को लिखा गया है। लेकिन मूल रूप से यह सिर्फ एक आंतरिक IList लपेटता है। –

1

हां, दुर्भाग्य से आप इस तरह से इसके बारे में नहीं जा सकते हैं। कॉलिंग ToList() सूची का एक नया नया उदाहरण बनाता है, इसलिए जब आप उस उदाहरण में आइटम जोड़ते हैं तो वे मूल सूची में दिखाई नहीं देंगे (जैसा आपने स्पष्ट रूप से खोजा है)।

मैं NHibernate का उपयोग नहीं करता, लेकिन यह देखने के लिए उत्सुक होगा कि आपका कंटेनर IList (गैर-जेनेरिक संस्करण) लागू करता है या नहीं। आपके द्वारा संदर्भित धागे से, ऐसा लगता है कि System.Collections.IList वास्तव में आवश्यक है (और यह List<T> द्वारा लागू किया गया है, यही कारण है कि यह काम करता है)। क्या आपका कंटेनर IList लागू करता है? जब आप अपने CustomList<T> यह समर्थन सूची में जोड़ता है करने के लिए जोड़

public CustomList<AnotherObject> Items  
{  
    return new CustomList<AnotherObject>(items); 
} 

अर्थात:

+1

मैं आदेश NHibernate को समायोजित करने के IList उपयोग करने के लिए है, लेकिन विंडोज कार्यप्रवाह सूची की आवश्यकता है। –

+0

NHibernate.Collection.Generic.PersistentGenericBag वास्तव में IList को लागू करता है। मैं इसका उपयोग कर सकता था लेकिन फिर मैं जेनेरिक सूची की टाइप-सुरक्षा खो देता हूं जिसे मैं नहीं करना चाहता था। विकल्प नीचे दिए गए एलेक्स द्वारा सुझाए गए एक रैपर को लिखना है, लेकिन यह मेरा आदर्श समाधान नहीं है। –

+1

कोई फर्क नहीं पड़ता कि आप क्या करते हैं आप टाइप-सुरक्षा खोने जा रहे हैं। यही कारण है कि सूची IList लागू नहीं करता है; यह आवश्यक है कि आप एक इंटरफ़ेस खोलें जो वाक्यबद्ध रूप से आपको एक तत्व जोड़ने की अनुमति देगा जो वास्तव में जेनेरिक के प्रकार से मेल नहीं खाता है। क्या आप धारावाहिकरण के "दूसरी तरफ" पर इस IList तक पहुंचने जा रहे हैं? यदि आप ऐसा करते हैं तो क्या आप उसे वापस आईएलआईस्ट पर नहीं डाल पाएंगे? –

0

क्या आप इसे इस तरह से नहीं डाल सकते हैं?

public class MyObject 
{ 
    private IList<AnotherObject> items; 
    public List<AnotherObject> Items() 
    { 
     return (List<AnotherObject>)items; 
    } 
} 

हैवेन्ट के पास यह कोशिश करने का मौका था, लेकिन मुझे लगता है कि इसे काम करना चाहिए!

+1

यह काम नहीं करता क्योंकि IList में अंतर्निहित वस्तु एक NHibernate.Collection.Generic.PersistentGenericBag जो सीधे एक सूची

+0

आह को castable नहीं है, ठीक है, तो मेरा उत्तर कोई बात नहीं है: एस – fredrik

0

मैं NHibernate PersistentBag (गैर सामान्य) संग्रह लागू करता IList ताकि आप IList बजाय IList<AnotherObject> के रूप में आइटम टाइप कर सकते हैं लगता है। आपके प्रश्न में दिए गए लिंक में कहा गया है कि समस्या यह है कि प्रतिकृतिकर्ता को एक IList की आवश्यकता होती है जो List<T> लागू करता है लेकिन IList<T> (आंकड़ा नहीं जाता)।

+0

एडम देखें टिप्पणी ऊपर क्यों IList IList लागू नहीं करता है। मैंने अपने बारे में पहले नहीं सोचा था। –

0

क्या इसे आईनेमेरेबल < टी > पर डाला जा सकता है? आप इस कोशिश कर सकते:

public class MyObject 
{ 
    private IList<AnotherObject> items; 
    public List<AnotherObject> Items 
    { 
     return new List<AnotherObject>items.Cast<AnotherObject>()); 
    } 
    // or, to prevent modifying the list 
    public IEnumerable<AnotherObject> Items 
    { 
     return items.Cast<AnotherObject>(); 
    } 
} 
+0

मुझे विंडोज वर्कफ़्लो के लिए एक आईएलिस्ट चाहिए। –

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