How to change enum definition without impacting clients using it in C#

匿名 (未验证) 提交于 2019-12-03 08:48:34

问题:

I have the following enum defined. I have used underscores as this enum is used in logging and i don't want to incur the overhead of reflection by using custom attribute.We use very heavy logging. Now requirement is to change "LoginFailed_InvalidAttempt1" to "LoginFailed Attempt1". If i change this enum, i will have to change its value across application. I can replace underscore by a space inside logging SP. Is there any way by which i can change this without affecting whole application.Please suggest.

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  } 

回答1:

The best way to do it will be with a Description attribute. I understand that you don't use reflection, but you can always cache the result so it only happens once?

Add the description attribute:

[Description("LoginFailed Attempt1")] LoginFailed_InvalidAttempt1 

Then when displaying the text value of the enum, you can get the description out using the following bit of code:

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

As you can see from the code above, the reflection is only done once. Any subsequent calls on the same Enum value will return the result from a Dictionary which is lightning fast.



回答2:

You can make two enum values have the same integer number, and mark one obsolete:

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

so then MyEnum.Value3 == MyEnum.NewValue3



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!