Enum.ToString()遵循EnumMemberAnnotation。

25 浏览
0 Comments

Enum.ToString()遵循EnumMemberAnnotation。

我有一个使用EnumMember注解的枚举,以便与JSON.NET序列化类似如下:

[DataContract]
[JsonConverter(typeof(StringEnumConverter))]
public enum Status
{
    [EnumMember(Value = "NOT_ADMITTED")]
    NotAdmitted,
    [EnumMember(Value = "ADMITTED")]
    Admitted
}

现在,不考虑JSON.NET序列化,我想将枚举实例转换为字符串,同时遵守数据合同中的EnumMember注解,例如:

aStatusInstance.ToString() == "NOT_ADMITTED"

有什么建议吗?谢谢!

更新:我的解决方案

我修改了接受答案中的代码,创建了一个扩展方法来获取EnumMember的值:

    public static string GetEnumMemberValue(this Enum enumValue)
    {
        var type = enumValue.GetType();
        var info = type.GetField(enumValue.ToString());
        var da = (EnumMemberAttribute[])(info.GetCustomAttributes(typeof(EnumMemberAttribute), false));
        if (da.Length > 0)
            return da[0].Value;
        else
            return string.Empty;
    }

0
0 Comments

问题的出现原因是希望在使用Enum.ToString()方法时,返回的字符串与EnumMember注解的值一致。然而,Enum.ToString()方法只返回枚举字段的名称,并不考虑其他注解的值。

为了解决这个问题,可以使用Description属性来装饰枚举,并将其值与EnumMember相同。首先,需要在枚举中添加DataContract和JsonConverter注解,并为每个枚举字段添加EnumMember和Description注解,示例如下:

[DataContract]
[JsonConverter(typeof(StringEnumConverter))]
public enum Status
{
    [EnumMember(Value = "NOT_ADMITTED")]
    [Description("NOT_ADMITTED")]
    NotAdmitted,
    [EnumMember(Value = "ADMITTED")]
    [Description("ADMITTED")]
    Admitted
}

然后,可以编写一个扩展方法,将其作为Enum类的扩展方法,用于获取枚举字段的描述。该方法通过反射获取字段的Description属性,并返回其值。示例如下:

public static string GetDescription(this Enum enumValue)
{
    Type type = enumValue.GetType();
    FieldInfo info = type.GetField(enumValue.ToString());
    DescriptionAttribute[] da = (DescriptionAttribute[])(info.GetCustomAttributes(typeof(DescriptionAttribute), false));
    if (da.Length > 0)
        return da[0].Description;
    else
        return string.Empty; 
}

最后,可以使用扩展方法来比较枚举字段的描述与指定的值是否相等。示例如下:

aStatusInstance.GetDescription() == "NOT_ADMITTED"

通过这种方式,可以在使用Enum.ToString()方法时,返回EnumMember注解的值,并与指定的值进行比较,从而解决了原问题。

0