2010-06-14 12 views
5

Ich habe die folgende Enum definiert. Ich habe Unterstriche verwendet, da diese Aufzählung bei der Protokollierung verwendet wird, und ich möchte nicht den Overhead der Reflexion durch Verwendung von benutzerdefinierten Attribut übernehmen. Wir verwenden sehr schwere Protokollierung. Jetzt muss "LoginFailed_InvalidAttempt1" in "LoginFailed Attempt1" geändert werden. Wenn ich diese Aufzählung ändere, muss ich ihren Wert über die Anwendung ändern. Ich kann den Unterstrich durch ein Leerzeichen innerhalb des Logging-SP ersetzen. Gibt es einen Weg, wie ich das ändern kann, ohne die gesamte Anwendung zu beeinflussen? Bitte schlagen Sie vor.Wie ändern Enum-Definition ohne Auswirkungen auf Clients in 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

Sie sagen, Sie ausgeben möchten einen freundlichen Enum Name anstelle des Enum ? Oder willst du sagen, dass du den Namen des tatsächlichen Namens durch eine Aufzählung mit einem Leerzeichen in seinem Namen ersetzen möchtest? – GenericTypeTea

+0

Ich möchte LoginFailed_InvalidAttempt1 zu Login Failed Versuch1 – Rohit

+0

konvertieren .. Was meinst du mit konvertieren von? – GenericTypeTea

Antwort

9

Der beste Weg, um es zu tun ist mit einem Attribut Beschreibung. Ich verstehe, dass Sie keine Reflexion verwenden, aber Sie können das Ergebnis immer zwischenspeichern, so dass es nur einmal passiert?

die Beschreibung Attribut hinzufügen:

[Description("LoginFailed Attempt1")] 
LoginFailed_InvalidAttempt1 

Dann, wenn Sie den Textwert des Enum anzuzeigen, können Sie die Beschreibung mit dem folgenden Stück Code erhalten:

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

Wie Sie sehen können Aus dem obigen Code wird die Reflexion nur einmal getan. Alle nachfolgenden Aufrufe desselben Enum-Werts geben das Ergebnis eines blitzschnellen Dictionary zurück.

+1

@Rohit, die Beschreibungen werden nur beim ersten Mal reflektiert (das ist der langsame Teil), danach kommt das Ergebnis aus einem Wörterbuch, also ist es sehr schnell. Ich denke, das würde dein Problem lösen. – SWeko

+0

ja, es ist blitzschnell außer zum ersten Mal. Danke für so ein tolles Stück Code. Es hilft uns tatsächlich, eine Menge Dinge anders zu machen. – Rohit

+0

@Rohit - kein Problem. – GenericTypeTea

0

Sie können zwei ENUM-Werte machen die gleiche ganze Zahl ist, und markieren Sie eine veraltet:

public enum MyEnum { 
    Value1, 
    Value2, 

    [Obsolete] 
    Value3, 

    NewValue3 = Value3, 
} 

so dann MyEnum.Value3 == MyEnum.NewValue3

+0

Wie hilft das? Ich lese es so, dass das OP "LoginFailed Attempt1" anstelle von "LoginFailed_InvalidAttempt1" ausgeben kann. Da Sie keine Leerzeichen in einen Enum-Namen eingeben können, sehe ich nicht, wie das Problem gelöst wird. Oder ich könnte mich irren. – GenericTypeTea

+0

MyEnum testValue = MyEnum.NewValue3; Wenn Sie "testValue" abfragen, erhalten Sie Value3, nicht "NewValue3" Sie könnten jedoch NewValue3 unmittelbar nach Value2 hinzufügen, was dies auflösen würde. – openshac

+1

Tauschen Sie die neuen Werte dann aus - veraltete Werte werden am Ende der Enum-Definition übergeben – thecoop

Verwandte Themen