2009-02-03 8 views
68

मैं अपने enum-value को int के रूप में क्रमबद्ध करना चाहता हूं, लेकिन मुझे केवल नाम मिलता है।मैं एक इंट मान को int के रूप में कैसे क्रमबद्ध कर सकता हूं?

public class Request { 
    public RequestType request; 
} 

public enum RequestType 
{ 
    Booking = 1, 
    Confirmation = 2, 
    PreBooking = 4, 
    PreBookingConfirmation = 5, 
    BookingStatus = 6 
} 

और कोड

Request req = new Request(); 
req.request = RequestType.Confirmation; 
XmlSerializer xml = new XmlSerializer(req.GetType()); 
StringWriter writer = new StringWriter(); 
xml.Serialize(writer, req); 
textBox1.Text = writer.ToString(); 

This answer (एक और सवाल करने के लिए) (बस सुनिश्चित करें कि मैं इसे गलत नहीं कर रहा हूँ होने के लिए):

यहाँ मेरी (नमूना) वर्ग और enum है ऐसा लगता है कि enums डिफ़ॉल्ट रूप से ints को serialize करना चाहिए, लेकिन ऐसा लगता है कि ऐसा नहीं लगता है।

<?xml version="1.0" encoding="utf-16"?> 
<Request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <request>Confirmation</request> 
</Request> 

मैं हर मूल्य पर एक "[XmlEnum (" X ")]" विशेषता डालकर मूल्य के रूप में क्रमानुसार करने में सक्षम है, लेकिन यह सिर्फ गलत लगता है: यहाँ मेरी उत्पादन होता है।

उत्तर

62

ज्यादातर समय, लोग नाम चाहते हैं, इनट्स नहीं। आप उद्देश्य के लिए एक शिम संपत्ति जोड़ सकते हैं?

[XmlIgnore] 
public MyEnum Foo {get;set;} 

[XmlElement("Foo")] 
[EditorBrowsable(EditorBrowsableState.Never), Browsable(false)] 
public int FooInt32 { 
    get {return (int)Foo;} 
    set {Foo = (MyEnum)value;} 
} 

या आप IXmlSerializable का उपयोग कर सकते हैं, लेकिन यह बहुत काम है।

+0

बस इतना स्पष्ट है कि स्निपेट क्या करता है XmlSerializer - IGNORE MyEnum प्रॉपर्टी को बताता है। और FooInt32 प्रॉपर्टी को सर्विसेज करें, जो सिर्फ इंट 32 मान के लिए MyEnum प्रोप को रोकता है। यह आपके लिए पूरी तरह से काम करेगा। – Cheeso

+0

यह तृतीय पक्ष पुस्तकालयों से एनम के संदर्भ में एक अच्छा समाधान है। – CtrlDot

+0

यह भी ध्यान दिया जाना चाहिए कि FooInt32 संपत्ति को Foo नाम के रूप में क्रमबद्ध किया गया है।मुझे यह जवाब सबसे ज्यादा पसंद है क्योंकि अगर आपके पास अपने enum में दर्जनों मूल्य हैं तो आपको केवल एक बार ऐसा करना होगा। –

-1

सिस्टम.इनम कक्षा पर एक नज़र डालें। पार्स विधि एनम ऑब्जेक्ट में एक स्ट्रिंग या int प्रतिनिधित्व को परिवर्तित करती है और ToString विधि Enum ऑब्जेक्ट को एक स्ट्रिंग में परिवर्तित करती है जिसे क्रमबद्ध किया जा सकता है।

+3

के साथ प्रतिस्थापित है जबकि सभी सच है, serialization के दौरान पारदर्शी रूप से उपयोग करने के लिए कैसे पता नहीं है, जो असली मुद्दा है। –

13

कृपया एक दिलचस्प तरीके के लिए नीचे पूर्ण उदाहरण कंसोल आवेदन कार्यक्रम प्राप्त करने के लिए आप का उपयोग कर के लिए DataContractSerializer जो खोज रहे हैं देखें:

using System; 
using System.IO; 
using System.Runtime.Serialization; 

namespace ConsoleApplication1 
{ 
    [DataContract(Namespace="petermcg.wordpress.com")] 
    public class Request 
    { 
     [DataMember(EmitDefaultValue = false)] 
     public RequestType request; 
    } 

    [DataContract(Namespace = "petermcg.wordpress.com")] 
    public enum RequestType 
    { 
     [EnumMember(Value = "1")] 
     Booking = 1, 
     [EnumMember(Value = "2")] 
     Confirmation = 2, 
     [EnumMember(Value = "4")] 
     PreBooking = 4, 
     [EnumMember(Value = "5")] 
     PreBookingConfirmation = 5, 
     [EnumMember(Value = "6")] 
     BookingStatus = 6 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataContractSerializer serializer = new DataContractSerializer(typeof(Request)); 

      // Create Request object 
      Request req = new Request(); 
      req.request = RequestType.Confirmation; 

      // Serialize to File 
      using (FileStream fileStream = new FileStream("request.txt", FileMode.Create)) 
      { 
       serializer.WriteObject(fileStream, req); 
      } 

      // Reset for testing 
      req = null; 

      // Deserialize from File 
      using (FileStream fileStream = new FileStream("request.txt", FileMode.Open)) 
      { 
       req = serializer.ReadObject(fileStream) as Request; 
      } 

      // Writes True 
      Console.WriteLine(req.request == RequestType.Confirmation); 
     } 
    } 
} 

request.txt की सामग्री हैं WriteObject करने के लिए कॉल के बाद इस प्रकार है :

<Request xmlns="petermcg.wordpress.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <request>2</request> 
</Request> 

आप DataContractSerializer के लिए System.Runtime.Serialization.dll विधानसभा के लिए एक संदर्भ की आवश्यकता होगी। इसलिए जैसे

[Serializable] 
public enum EnumToSerialize 
{ 
    [XmlEnum("1")] 
    One = 1, 
    [XmlEnum("2")] 
    Two = 2 
} 

यह XML में क्रमानुसार जाएगा (का कहना है कि माता-पिता वर्ग CustomClass है):

<CustomClass> 
    <EnumValue>2</EnumValue> 
</CustomClass> 
+0

प्रश्न पहले से ही [XmlEnum ("...")] उपयोग, XmlSerializer के समतुल्य [EnumMember ("...")] के बराबर नोट करता है - इसलिए मुझे यकीन नहीं है कि यह कुछ भी जोड़ता है जिसे ओपी पहले से ही नहीं जानता है। –

+1

इसके अलावा - चूंकि DataContractSerializer निजी सदस्यों का समर्थन करता है, इसलिए सरल दृष्टिकोण एक * निजी * शिम संपत्ति होगी जो 'int' और enum के बीच होती है। –

+0

हां मैंने देखा कि पुनः: XmlEnum धन्यवाद लेकिन जैसा कि मैंने कहा है, मुझे लगता है कि यह सवाल का एक दिलचस्प समाधान है। कौन सा समाधान 'सरल' व्यक्तिपरक है और आखिरकार प्रश्नकर्ता तक निश्चित रूप से है। सहमत: 'शिम' दृष्टिकोण के साथ DataContractSerializer और निजी सदस्यों के लिए इसका समर्थन –

125

सबसे आसान तरीका है [XmlEnum] का उपयोग करें ताकि जैसे गुण है enum विकल्पों में स्पष्ट गैर-अनुक्रमिक मान निर्दिष्ट कर रहे हैं, मुझे लगता है कि आप एक समय में एक से अधिक मान निर्दिष्ट करने में सक्षम होना चाहते हैं (बाइनरी झंडे), तो स्वीकृत उत्तर आपका एकमात्र विकल्प है। प्रीबुकिंग में पासिंग | प्रीबुकिंग कॉन्फ़िगरेशन में 9 का पूर्णांक मान होगा और सीरिएलाइज़र इसे खराब करने में सक्षम नहीं होगा, इसे एक शिम संपत्ति के साथ कास्टिंग करेगा हालांकि यह अच्छी तरह से काम करेगा। या शायद आप 3 मान को याद कर चुके हैं :)

+0

मैं इसे अपने कम काम और पढ़ने/समझने में आसान के रूप में बहुत पसंद करता हूं। मैं इस विधि की तुलना और उपर्युक्त स्वीकृत उत्तर –

+5

की तुलना देखना चाहता हूं यह तर्कसंगत है कि यह वास्तव में स्वीकार किए गए उत्तर से कम काम है या नहीं। अधिक enum मूल्य = अधिक रखरखाव। – youwhut

+2

+1 यह भी मेरी पसंदीदा विधि है - एक अनावश्यक शिम संपत्ति क्यों बनाएं जब कुछ अतिरिक्त निर्देश आपको (डी) एनम को सही ढंग से क्रमबद्ध करने की अनुमति देंगे। – CJM

0

आप के बाद से

+2

मुझे अभी एक आसान enum दोस्त मिला है जिसे [ध्वज] कहा जाता है जो आपको थोड़ा झंडे का उपयोग करने की अनुमति देता है और वे सही विकल्पों पर वापस क्रमबद्ध होते हैं ... –

1
using System.Xml.Serialization; 

public class Request 
{  
    [XmlIgnore()] 
    public RequestType request; 

    public int RequestTypeValue 
    { 
     get 
     { 
     return (int)request; 
     } 
     set 
     { 
     request=(RequestType)value; 
     } 
    } 
} 

public enum RequestType 
{ 
    Booking = 1, 
    Confirmation = 2, 
    PreBooking = 4, 
    PreBookingConfirmation = 5, 
    BookingStatus = 6 
} 

उपरोक्त दृष्टिकोण मेरे लिए काम करता है।