可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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