2012-03-30 18 views
12

क्या सी # में int से एक enum deserialize संभव है। जैसे अगर मैं निम्नलिखित वर्ग है:सी # पूर्णांक से deserializing enums

class Employee 
{ 
    public string Name { get; set;} 
    public int EmployeeTypeID { get; set;} 
} 

मैं आसानी से इस एक्सएमएल

<Employee> 
     <Name>Joe Bloggs</Name> 
     <EmployeeTypeID>1</EmployeeTypeID> 
    </Employee> 

से बना सकते हैं कुछ इस तरह का उपयोग कर: बहुत कम काम शामिल के साथ

Employee employee = (Employee)new XmlSerializer(typeof(Employee)).Deserialize(XmlReader); 

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

public enum EmployeeTypeEnum 
{ 
    Admin = 1, 
    Sales = 2 
} 

तो मेरे वर्ग बन जाता है: के बजाय एक पूर्णांक EmployeeType होने का अब मान एक enum है

class Employee 
{ 
    public string Name { get; set;} 
    public EmployeeTypeEnum EmployeeTypeID { get; set;} 
} 

मैं एक ही एक्सएमएल का उपयोग करें और बनाने के ग # पहचान कर सकते हैं कि एक्सएमएल में EmployeeTypeID के पूर्णांक मूल्य enum के int मूल्य के साथ मेल खाना चाहिए? वहां अन्य प्रश्न भी समान हैं, लेकिन किसी के पास बहुत ही संतोषजनक उत्तर नहीं है, और कोड में थोक परिवर्तन शामिल हैं। मैं एक बेहतर समाधान की उम्मीद कर रहा हूं ...

एक संभावित अलग नोट (और कुछ प्रतिक्रियाओं की प्रत्याशा में थोड़ा) के रूप में, इस अभ्यास के लिए एनम्स का उपयोग सबसे अच्छा से बचा है? क्या मुझे कुंजी-मूल्य जोड़े का उपयोग करना चाहिए? यदि परिवर्तन होने की संभावना है तो मैं हमेशा कुंजी-मूल्य जोड़े (या समान) का उपयोग करता हूं, लेकिन इस मामले में कर्मचारी टाइप तय किया गया है और कभी नहीं बदलेगा।

+1

+1 - उन प्रश्नों में से एक जो मैं आया हूं, मैं अधिक उपयोग नहीं कर सकता लेकिन उत्तर देखने के लिए तत्पर हूं। – SkonJeet

+2

मदद http://stackoverflow.com/questions/506368/how-do-i-serialize-an-enum-value-as-an-int करता है? – Bridge

+0

या http://stackoverflow.com/questions/4250656/deserializing-enums? – kerrubin

उत्तर

18

सैद्धांतिक रूप से (= मैं इसे करने की कोशिश नहीं की है), अपने enum मूल्यों के XmlEnum विशेषता जोड़ने चाल करना चाहिए:

public enum EmployeeTypeEnum 
{ 
    [XmlEnum("1")] Admin = 1, 
    [XmlEnum("2")] Sales = 2 
} 

यह XmlSerializer बताता है कि EmployeeTypeEnum.Admin के एक मूल्य हो रहा है स्ट्रिंग 1और इसके विपरीत (जो आपको चाहिए) के रूप में क्रमबद्ध किया गया है।

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

3

आप XML तो इस प्रारूप में:

<Employee> 
    <Name>Shiv</Name> 
    <EmployeeTypeID>Sales</EmployeeTypeID> 
</Employee> 

यह रूप में काम करेगा। तुम इतनी तरह XmlEnum विशेषता के साथ अपने enum सजाने हैं:

public enum EmployeeTypeEnum 
{ 
    [XmlEnum("1")] 
    Admin = 1, 
    [XmlEnum("2")] 
    Sales = 2 
} 

तो फिर आप अपने xml फ़ाइल में पूर्णांक मूल्यों का उपयोग कर सकते हैं और वे पूर्ण रूप से अपने enum करने के लिए मैप किया जाएगा।

व्यक्तिगत रूप से, मैं इस तरह के मामलों में enums का उपयोग करना पसंद करते हैं। यहां तक ​​कि अगर समय के साथ enum में आइटम बढ़ सकता है, मैं enums का उपयोग करना पसंद करते हैं। असल में ऐसे enums डेटाबेस से उत्पन्न कोड हैं, इसलिए कोड में आप आईडी (अधिक पढ़ने योग्य) के साथ काम नहीं करते हैं।

0

एक्सएमएल फ़ाइल में, पूर्णांक मान के स्थिर में नामित निरंतर उपयोग करें। यह ठीक काम करेगा।

<Employee> 
     <Name>Joe Bloggs</Name> 
     <EmployeeTypeID>Admin</EmployeeTypeID> 
</Employee> 
संबंधित मुद्दे