2010-06-14 13 views
5

Tengo la siguiente enumeración definida. He usado guiones bajos ya que esta enumeración se usa en el registro y no quiero incurrir en la sobrecarga de la reflexión mediante el uso de un atributo personalizado. Usamos un registro muy pesado. Ahora el requisito es cambiar "LoginFailed_InvalidAttempt1" a "LoginFailed Attempt1". Si cambio esta enumeración, tendré que cambiar su valor en la aplicación. Puedo reemplazar el guion bajo por un espacio dentro del logging SP. ¿Hay alguna manera por la cual puedo cambiar esto sin afectar toda la aplicación? Sugiero.Cómo cambiar la definición de enum sin afectar a los clientes que la usan en C#

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

¿Estás diciendo que desea generar un nombre de enumeración de usar en lugar de la enumeración ? ¿O está diciendo que quiere reemplazar el nombre de la enumeración real con una enumeración con un espacio en su nombre? – GenericTypeTea

+0

Quiero convertir LoginFailed_InvalidAttempt1 para Iniciar sesión fallido Attempt1 – Rohit

+0

.. ¿A qué te refieres con la conversión? – GenericTypeTea

Respuesta

9

La mejor manera de hacerlo será con un atributo de Descripción. Entiendo que no usa el reflejo, pero siempre puede almacenar en caché el resultado para que solo ocurra una vez.

Añadir la descripción del atributo:

[Description("LoginFailed Attempt1")] 
LoginFailed_InvalidAttempt1 

A continuación, cuando se muestra el valor de texto de la enumeración, se puede obtener la descripción a cabo utilizando el siguiente fragmento de código:

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

Como se puede ver del código anterior, la reflexión solo se hace una vez. Cualquier llamada subsiguiente en el mismo valor Enum devolverá el resultado de Dictionary, que es muy rápido.

+1

@Rohit, las descripciones se reflejan solo la primera vez (esa es la parte lenta), después de eso, el resultado es de un diccionario, por lo que es muy rápido. Creo que esto resolvería tu problema. – SWeko

+0

sí, es rapidísimo, excepto la primera vez. Gracias por una gran pieza de código. En realidad, nos ayuda a hacer muchas cosas de manera diferente. – Rohit

+0

@Rohit: no hay problema. – GenericTypeTea

0

Puede hacer dos valores de enumeración tienen el mismo número entero, y marque una obsoleta:

public enum MyEnum { 
    Value1, 
    Value2, 

    [Obsolete] 
    Value3, 

    NewValue3 = Value3, 
} 

por lo que entonces MyEnum.Value3 == MyEnum.NewValue3

+0

¿Cómo ayuda esto? La forma en que lo leo es que el OP quiere poder generar "AtteFailed Attempt1" en lugar de "LoginFailed_InvalidAttempt1". Como no puede poner espacios dentro de un nombre Enum, no veo cómo esto resuelve el problema? O podría estar equivocado. – GenericTypeTea

+0

MyEnum testValue = MyEnum.NewValue3; Cuando consulta "testValue" obtiene Value3, no "NewValue3" Sin embargo, podría agregar NewValue3 inmediatamente después de Value2, lo que resolvería esto. – openshac

+1

Cambie los valores nuevos a continuación: los valores obsoletos van al final de la definición de enum – thecoop

Cuestiones relacionadas