2009-07-13 12 views
15

C'è un modo per inserire gli spazi in una costante enum di C#? Ho letto che si può fare in VB in questo modo:Spaces in C# Enums

Public Enum EnumWithSpaces 
    ConstantWithoutSpaces 
    [Constant With Spaces] 
End Enum 

... e poi accedere in questo modo:

Public Sub UsingEnumWithSpaces() 

    Dim foo As EnumWithSpaces = EnumWithSpaces.[Constant With Spaces] 

End Sub 

Questo implica per me che il CLR in grado di gestire un enum con spazi.

C'è un modo per farlo in C#?

risposta

36

Questo post del blog potrebbe aiutare:

http://blog.spontaneouspublicity.com/2008/01/17/associating-strings-with-enums-in-c/

Dall'articolo:!

Ma enumerazioni non possono avere spazi in C#" si dicono bene. , Mi piace utilizzare il System.ComponentModel.DescriptionAttribute per aggiungere una descrizione più amichevole a i valori enum. L'esempio enum può essere riscritta così:

public enum States 
{ 
    California, 
    [Description("New Mexico")] 
    NewMexico, 
    [Description("New York")] 
    NewYork, 
    [Description("South Carolina")] 
    SouthCarolina, 
    Tennessee, 
    Washington 
} 

Si noti che non metto le descrizioni su elementi in cui la versione ToString() di che visualizza l'elemento più che bene.

+0

Grazie Judah per aver cercato di ripulirlo per me. Stavo passando un pò di tempo cercando di farlo sembrare giusto. –

+2

Sarebbe bello se ToString utilizzasse automaticamente l'attributo. Così com'è, però, non è tutto ciò che è utile. –

+0

Immagino che si possa sempre usare 'DescriptionAttribute' insieme a un metodo di estensione' ToDescription'. – cdmckay

9

CLR può gestire assolutamente qualsiasi carattere negli identificatori. Tuttavia, C# limita i caratteri identificativi a quelli legali sotto il CLS, che non è lo spazio. Lo stesso vale per VB.NET, a proposito - spazi all'interno di parentesi quadre usate per lavorare in VB6, ma non in VB.NET.

+0

Esiste comunque la possibilità di modificare una costante enum utilizzando la riflessione? – cdmckay

+0

Intendi caricare un assembly compilato ed elaborarlo per sostituire i nomi enum o modificare la costante in fase di esecuzione? Quest'ultimo non è possibile; il primo è, ma penso che sarebbe molto più semplice usare 'ildasm' per disassemblarlo, sostituire i nomi secondo necessità (questo può essere automatizzato con regex), e usare' ilasm' per renderlo di nuovo un assembly. In alternativa, puoi dichiarare il tuo enum in IL, in primo luogo, usare 'ilasm' per compilarlo in un .netmodule, e quindi collegare quel modulo nel tuo assembly C#/VB. –

+0

Alla fine ho usato semplicemente 'DescriptionAttribute' e poi ho scritto la mia propria classe statica per accedere all'enum come se le' DescriptionAttribute' fossero le costanti. – cdmckay

0

Se si lavora con Visual C# 3.0 o superiore ho trovato conveniente per estendere solo la classe enum e utilizzare una regex per inserto spazi dove neccessary: ​​

public static class EnumExtension 
{ 
    public static String ToDisplayString(this Enum e) 
    { 
     Regex regex = new Regex(@"([^\^])([A-Z][a-z$])"); 

     return regex.Replace(e.ToString(), new MatchEvaluator(m => 
     { 
      return String.Format("{0} {1}", m.Groups[1].Value, m.Groups[2].Value); 
     })); 
    } 
} 

Avviso questo consente di lavorare con qualsiasi enum come è senza aggiungere descrizioni ad ogni valore.

String enumWithSpaces = MessageBoxButtons.OKCancel.ToDisplayString();