When you serialize an enumeration (Enum in VB.NET, enum in C#), by default the XML string representation of the enumerated member is the name of the enumeration member (i.e. the same as calling the ToString function of the enumeration member). For example, if the Color property of the following object was set to Green, the XML representation of that property would be <Color>Green</Color>:
Public Enum PrimaryColor        
    Invalid = 0         
    Red = 1         
    Green = 2         
    Blue = 3         
End Enum        
       
<Serializable()> _         
Public Class Sample        
         
    Public Property Color() As PrimaryColor        
        Get        
            Return mColor        
        End Get        
        Set(ByVal value As PrimaryColor)        
            mColor = value         
        End Set        
    End Property        
    Private mColor As PrimaryColor        
     
End Class          
This default behavior can be modified using the XmlEnumAttribute Class. For example, if the enumeration defined above was changed as shown below, the XML representation of the Color property would be <Color>G</Color>.
Public Enum PrimaryColor        
    Invalid = 0         
    <System.Xml.Serialization.XmlEnum("R")> _        
    Red = 1         
    <System.Xml.Serialization.XmlEnum("G")> _        
    Green = 2         
    <System.Xml.Serialization.XmlEnum("B")> _        
    Blue = 3         
End Enum          
Even with the new XmlEnum values applied to the enumeration members, the ToString function will still return the name of the enumeration member, not the XmlEnum value. The following function will take an enumeration value and return its XML string value (either the XmlEnum value, if present, or the ToString value):
Public Shared Function ToXmlString( _        
    ByVal value As [Enum]) As String        
        
    Dim XmlEnumAttributes() As _        
        System.Xml.Serialization.XmlEnumAttribute         
    Dim EnumFieldInfo As System.Reflection.FieldInfo        
         
    ' Verify Input Arguments        
    If value Is Nothing Then        
        Throw New ArgumentNullException("value")        
    End If        
        
    ' Get the Field Information for the  
    ' enumeration member        
    EnumFieldInfo = _  
        value.GetType().GetField(value.ToString())         
        
    ' Get the XmlEnum attributes for the  
    ' enumeration member         
    XmlEnumAttributes = CType( _        
        EnumFieldInfo.GetCustomAttributes( _         
        GetType(System.Xml.Serialization.XmlEnumAttribute), True), _        
        System.Xml.Serialization.XmlEnumAttribute())         
        
    ' Check to see if an XmlEnum attribute was found        
    If XmlEnumAttributes.Length < 1 Then        
        ' Return the default value        
        Return value.ToString()        
    Else        
        ' Return the XmlEnum value        
        Return XmlEnumAttributes(0).Name        
    End If        
        
End Function
 
1 comment:
Thank you for this- it worked perfectly for me after I was stuck for awhile.
Post a Comment