c# - 根据 XmlEnumAttribute 名称值检索枚举值

标签 c# vb.net reflection enums

我需要一个通用函数来根据枚举的 XmlEnumAttribute“名称”属性检索枚举的名称或值。例如,我定义了以下枚举:

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

第一个 Currency 枚举值为 1;枚举名称是“CDN”; XMLEnumAttribute Name 属性值为“00”。

如果我有枚举值,我可以使用以下通用函数检索 XmlEnumAttribute“名称”值:

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

所以使用上面的函数,我可以指定 Currency 枚举类型,传递一个值 1,返回值将为“00”。

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

如有任何帮助,我们将不胜感激。

最佳答案

解决这个完全相同的问题的要求使我想到了这个问题和答案。当我在 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

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);
}

关于c# - 根据 XmlEnumAttribute 名称值检索枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3047125/

相关文章:

java - 使用动态引用调用方法

c# - 如何反射(reflect)应用于枚举类型本身的自定义属性

c# - 在 C# 中追加两个或多个字节数组

c# - GC 时间百分比高的原因是什么?对于我们在 APM perfmonitor 工具中的应用程序池,我们看到它超过 99% 并保持数小时

c# - 使工作角色的多个实例执行相同工作的推荐方法是什么?

.net - 如何修改 .net 的 BackgroundWorker 类,以便它在方法完成时触发自定义事件

c# - 调用基类静态方法时获取调用者派生类

c# - 为什么为匿名类生成的 GetHashCode() 实现中的初始哈希值取决于属性名称?

.net - 在 IIS 上部署 .NET MVC 4 应用程序时,物理路径应指向何处

vb.net - 组合框事件 : SelectedIndexChanged vs. SelectedValueChanged