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