2009-07-13 13 views
15

Gibt es eine Möglichkeit, Leerzeichen in eine C# Enum-Konstante zu setzen? Ich habe gelesen, dass Sie es in VB, indem Sie dies tun können:Leerzeichen in C# Enums

Public Enum EnumWithSpaces 
    ConstantWithoutSpaces 
    [Constant With Spaces] 
End Enum 

... und es dann wie folgt zugreifen:

Public Sub UsingEnumWithSpaces() 

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

End Sub 

Das ist für mich bedeutet, dass die CLR eine ENUM umgehen kann mit Leerzeichen.

Gibt es eine Möglichkeit, dies in C# zu tun?

Antwort

36

Dieser Blog-Eintrag könnte Ihnen helfen:

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

Aus dem Artikel:

Aber Aufzählungen kann in C# keine Leerzeichen“ Sie sagen Well. Ich verwende gerne System.ComponentModel.DescriptionAttribute , um eine freundlichere Beschreibung zuhinzuzufügendie Enum-Werte. Das Beispiel ENUM kann wie folgt neu geschrieben werden:

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

Beachten Sie, dass ich nicht setzen Beschreibungen auf Posten, bei denen die ToString() Version dieses Elements zeigt ganz gut.

+0

Danke Judah für den Versuch, das für mich aufzuräumen. Ich hatte eine Menge Zeit damit, es richtig aussehen zu lassen. –

+2

Das wäre schön, wenn ToString das Attribut automatisch verwendet. Wie es aussieht, ist es nicht so nützlich. –

+0

Ich denke, Sie könnten immer 'DescriptionAttribute' zusammen mit einer' ToDescription'-Erweiterungsmethode verwenden. – cdmckay

9

CLR kann absolut jedes Zeichen in Bezeichnern verarbeiten. C# beschränkt jedoch die Kennungszeichen auf diejenigen, die unter dem CLS zulässig sind, was nicht der Fall ist. Das gleiche gilt übrigens auch für VB.NET - Leerzeichen in eckigen Klammern, die in VB6 verwendet werden, aber nicht in VB.NET.

+0

Gibt es sowieso eine Möglichkeit, eine Enum-Konstante mit Reflektion zu modifizieren? – cdmckay

+0

Meinst du damit, eine kompilierte Assembly zu laden und sie zu verarbeiten, um Enum-Namen zu ersetzen oder die Konstante zur Laufzeit zu ändern? Letzteres ist nicht möglich; Ersteres ist, aber ich denke, es wäre viel einfacher, "ildasm" zu verwenden, um es zu zerlegen, die Namen nach Bedarf zu ersetzen (dies kann mit Regex automatisiert werden) und "ilasm" zu verwenden, um es wieder zu einer Assembly zu machen. Alternativ können Sie Ihre enum in IL an erster Stelle deklarieren, verwenden Sie 'ilasm', um es zu einem .netmodule zu kompilieren, und verknüpfen Sie dann das Modul in Ihrer C#/VB-Assembly. –

+0

Ich landete nur mit dem 'DescriptionAttribute' und schrieb dann meine eigene statische Klasse für den Zugriff auf die Enumeration, als ob' DescriptionAttribute' die Konstanten wären. – cdmckay

0

Wenn Sie mit Visual C# 3.0 oder höher ich gearbeitet habe es bequem gefunden, nur die Enum-Klasse zu erweitern und einen regulären Ausdruck verwenden Räume Einsatz, wo nötig:

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

Hinweis dies Ihnen erlaubt zu arbeiten mit jeder enum wie es ist, ohne Beschreibungen zu jedem Wert hinzuzufügen.

String enumWithSpaces = MessageBoxButtons.OKCancel.ToDisplayString();