我需要一个通用函数来基于枚举的XmlEnumAttribute“Name”属性检索枚举的名称或值。例如,我定义了以下枚举:
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“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
因此,使用上面的函数,我可以指定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/