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

我定义了以下枚举。 我使用下划线,因为这个枚举用于日志记录,我不想通过使用自定义属性产生reflection的开销。我们使用非常繁重的日志记录。 现在要求将“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 } 

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

添加description属性:

 [Description("LoginFailed Attempt1")] LoginFailed_InvalidAttempt1 

然后,当显示枚举的文本值时,您可以使用以下代码来获取描述:

 private static Dictionary> enumMaps = null; public static string GetDescription(Enum value) { Type eType = value.GetType(); if (enumMaps == null) { enumMaps = new Dictionary> (); } Dictionary map; if (enumMaps.ContainsKey(eType)) { map = enumMaps[eType]; } else { map = new Dictionary(); 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]; } 

从上面的代码中可以看出,reflection只进行一次 。 对同一Enum值的任何后续调用都将返回一个快速的Dictionary结果。

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

 public enum MyEnum { Value1, Value2, [Obsolete] Value3, NewValue3 = Value3, } 

那么MyEnum.Value3 == MyEnum.NewValue3