I need a Generic function to retrieve the name or value of an enum based on the XmlEnumAttribute "Name" property of the enum. For example I have the following enum defined:
Public Enum Currency
<XmlEnum("00")> CDN = 1
<XmlEnum("01")> USA= 2
<XmlEnum("02")> EUR= 3
<XmlEnum("03")> JPN= 4
End Enum
The first Currency enum value is 1; the enum name is "CDN"; and the XMLEnumAttribute Name property value is "00".
If I have the enum value, I can retrieve the XmlEnumAttribute "Name" value using the following generic function:
Public Function GetXmlAttrNameFromEnumValue(Of T)(ByVal pEnumVal As T) As String
Dim type As Type = pEnumVal.GetType
Dim info As FieldInfo = type.GetField([Enum].GetName(GetType(T), pEnumVal))
Dim att As XmlEnumAttribute = CType(info.GetCustomAttributes(GetType(XmlEnumAttribute), False)(0), XmlEnumAttribute) 'If there is an xmlattribute defined, return the name
Return att.Name
End Function
So using the above function, I can specify the Currency enum type, pass a value of 1, and the return value will be "00".
What I need is a function to perform if the opposite. If I have the XmlEnumAttribute Name value "00", I need a function to return a Currency enum with a value of 1. Just as useful would be a function that would return the enum name "CDN". I could then simply parse this to get the enum value.
Any assistance would be appreciated.
I do something similar with custom attributes and I use this method to get the EnumValue based on the Attribute Value. GetStringValue is my custom method, similar to your example above.
For the whole process I use check this post and the answers: Extending Enums, Overkill?
Sorry this is in C#, just realized you were using VB.NET above.
@Dean, @Jason and @Camron, thank you for your solutions. Your solutions helped me in solving my problem, where, given an XmlEnumAttribute name, the actual enum value was needed.
My variant is mentioned here.
I am also including it here as as asked by one of our moderators:
The actual problem was how to get Item10, when given a value of 10. Taking a cue from the solution cited by our above mentioned friends, I came up with the following method, which when passed a value contained in XmlEnumAttribute, would return the enum value:
Here's a variation that generates a dictionary from the enum, allowing you to potentially cache the reflection part of it should you need to use it a lot.
usage:
A requirement to solve this exact same problem led me to this question and answer. As I develop in VB.NET, I rewrote CkH's solution into VB and modified it to use your
GetXmlAttrNameFromEnumValue
function.C# Version:
Slightly modified from: http://www.wackylabs.net/2006/06/getting-the-xmlenumattribute-value-for-an-enum-field/