Как изменить определение перечисления, не влияя на клиентов, использующих его в C # - PullRequest
5 голосов
/ 14 июня 2010

У меня определено следующее перечисление.Я использовал подчеркивания, так как это перечисление используется при ведении журнала, и я не хочу нести накладные расходы на рефлексию, используя пользовательский атрибут.Теперь необходимо изменить «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 ]

9 голосов
/ 14 июня 2010

Лучший способ сделать это будет с атрибутом 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];
}

Как видно из кода выше, отражение выполняется только один раз .Любые последующие вызовы с тем же значением Enum будут возвращать результат от Dictionary, который молниеносно.

0 голосов
/ 14 июня 2010

Вы можете сделать два значения enum одинаковыми целыми числами и отметить одно устаревшее:

public enum MyEnum {
    Value1,
    Value2,

    [Obsolete]
    Value3,

    NewValue3 = Value3,
}

так тогда MyEnum.Value3 == MyEnum.NewValue3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...