根据XmlEnumAttribute名称值检索枚举值

Dea*_*ean 17 c# vb.net reflection enums

我需要一个Generic函数来根据枚举的XmlEnumAttribute"Name"属性检索枚举的名称或值.例如,我定义了以下枚举:

Public Enum Currency
   <XmlEnum("00")> CDN = 1
   <XmlEnum("01")> USA= 2
   <XmlEnum("02")> EUR= 3
   <XmlEnum("03")> JPN= 4
End Enum
Run Code Online (Sandbox Code Playgroud)

第一个Currency枚举值为1; 枚举名称是"CDN"; 并且XMLEnumAttribute Name属性值为"00".

如果我有枚举值,我可以使用以下通用函数检索XmlEnumAttribute"Name"值:

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
Run Code Online (Sandbox Code Playgroud)

因此,使用上面的函数,我可以指定Currency枚举类型,传递值1,返回值将为"00".

我需要的是一个相反的功能.如果我有XmlEnumAttribute Name值"00",我需要一个函数来返回值为1的Currency枚举.同样有用的是一个返回枚举名称"CDN"的函数.然后我可以简单地解析它以获得枚举值.

任何援助将不胜感激.

Jas*_*kan 17

解决这个完全相同问题的要求使我得到了这个问题和答案.当我在VB.NET中开发时,我将CkH的解决方案重写为VB并将其修改为使用您的GetXmlAttrNameFromEnumValue函数.

Public Shared Function GetCode(Of T)(ByVal value As String) As T
    For Each o As Object In System.Enum.GetValues(GetType(T))
        Dim enumValue As T = CType(o, T)
        If GetXmlAttrNameFromEnumValue(Of T)(enumValue).Equals(value, StringComparison.OrdinalIgnoreCase) Then
            Return CType(o, T)
        End If
    Next

    Throw New ArgumentException("No code exists for type " + GetType(T).ToString() + " corresponding to value of " + value)
End Function
Run Code Online (Sandbox Code Playgroud)

C#版本:

public static string GetXmlAttrNameFromEnumValue<T>(T pEnumVal)
{
    // http://stackoverflow.com/q/3047125/194717
    Type type = pEnumVal.GetType();
    FieldInfo info = type.GetField(Enum.GetName(typeof(T), pEnumVal));
    XmlEnumAttribute att = (XmlEnumAttribute)info.GetCustomAttributes(typeof(XmlEnumAttribute), false)[0];
    //If there is an xmlattribute defined, return the name

    return att.Name;
}
public static T GetCode<T>(string value)
{
    // http://stackoverflow.com/a/3073272/194717
    foreach (object o in System.Enum.GetValues(typeof(T)))
    {
        T enumValue = (T)o;
        if (GetXmlAttrNameFromEnumValue<T>(enumValue).Equals(value, StringComparison.OrdinalIgnoreCase))
        {
            return (T)o;
        }
    }

    throw new ArgumentException("No XmlEnumAttribute code exists for type " + typeof(T).ToString() + " corresponding to value of " + value);
}
Run Code Online (Sandbox Code Playgroud)


CkH*_*CkH 7

我使用自定义属性执行类似操作,并使用此方法根据属性值获取EnumValue.GetStringValue是我的自定义方法,类似于上面的示例.

public static class Enums 
{ 
    public static T GetCode<T>(string value) 
    { 
        foreach (object o in System.Enum.GetValues(typeof(T))) 
        { 
            if (((Enum)o).GetStringValue().Equals(value, StringComparison.OrdinalIgnoreCase))
                return (T)o; 
        } 
        throw new ArgumentException("No code exists for type " + typeof(T).ToString() + " corresponding to value of " + value); 
    } 
}  
Run Code Online (Sandbox Code Playgroud)

对于整个过程我使用检查这篇文章和答案:扩展枚举,矫枉过正?

对不起,这是在C#中,只是意识到你上面使用的是VB.NET.