如何更改枚举定义而不影响在C#中使用它的客户端

时间:2010-06-14 12:22:28

标签: c# c#-3.0

我定义了以下枚举。我使用下划线,因为这个枚举用于日志记录,我不想通过使用自定义属性产生反射的开销。我们使用非常繁重的日志记录。现在要求将“LoginFailed_InvalidAttempt1”更改为“LoginFailed Attempt1”。如果我更改此枚举,我将不得不在应用程序中更改其值。我可以用记录SP中的空格替换下划线。有什么方法可以改变这个而不影响整个应用程序。请建议。

public enum ActionType
{
    None,
    Created,
    Modified,
    Activated,
    Inactivated,
    Deleted,
    Login,
    Logout,
    ChangePassword,
    ResetPassword,
    InvalidPassword,
    LoginFailed_LockedAccount,
    LoginFailed_InActiveAccount,
    LoginFailed_ExpiredAccount,
    ForgotPassword,
    LoginFailed_LockedAccount_InvalidAttempts,
    LoginFailed_InvalidAttempt1,
    LoginFailed_InvalidAttempt2,
    LoginFailed_InvalidAttempt3,
    ForgotPassword_InvalidAttempt1,
    ForgotPassword_InvalidAttempt2,
    ForgotPassword_InvalidAttempt3,
    SessionTimeOut,
    ForgotPassword_LockedAccount,
    LockedAccount,
    ReLogin,
    ChangePassword_Due_To_Expiration,
    ChangePassword_AutoExpired

}

2 个答案:

答案 0 :(得分:9)

最好的方法是使用Description属性。我知道你不使用反射,但是你总是可以缓存结果,所以只发生一次?

添加description属性:

[Description("LoginFailed Attempt1")]
LoginFailed_InvalidAttempt1

然后在显示枚举的文本值时,您可以使用以下代码获取说明:

private static Dictionary<Type, Dictionary<Enum, string>> enumMaps = null;

public static string GetDescription(Enum value)
{
    Type eType = value.GetType();
    if (enumMaps == null)
    {
        enumMaps = new Dictionary<Type, Dictionary<Enum, string>> ();
    }
    Dictionary<Enum, string> map;
    if (enumMaps.ContainsKey(eType))
    {
        map = enumMaps[eType];
    }
    else
    {
        map = new Dictionary<Enum, string>();
        foreach (Enum e in Enum.GetValues(eType))
        {
            FieldInfo fi = eType.GetField(e.ToString());
            DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(
                typeof(DescriptionAttribute), false);
            map[e] = (attributes.Length > 0) ? attributes[0].Description : e.ToString();
        }
        enumMaps[eType] = map;
    }
    return map[value];
}

从上面的代码中可以看出,反射仅在一次时完成。对同一枚举值进行的任何后续调用都将返回Dictionary的快速结果。

答案 1 :(得分:0)

您可以使两个枚举值具有相同的整数,并标记一个已过时:

public enum MyEnum {
    Value1,
    Value2,

    [Obsolete]
    Value3,

    NewValue3 = Value3,
}

然后MyEnum.Value3 == MyEnum.NewValue3