2009-07-13 14 views
15

Czy istnieje sposób na umieszczenie spacji w stałej wyliczeniowej C#? Czytałem, że można to zrobić w VB w ten sposób:Przestrzenie w C# Enums

Public Enum EnumWithSpaces 
    ConstantWithoutSpaces 
    [Constant With Spaces] 
End Enum 

... a dostęp do niego tak:

Public Sub UsingEnumWithSpaces() 

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

End Sub 

Oznacza mi się, że CLR może obsłużyć enum ze spacjami.

Czy jest jakiś sposób to zrobić w języku C#?

Odpowiedz

36

Ten blogu może pomóc:

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

Z artykułu:

Ale teksty stałe nie może mieć miejsca w C#” mówisz dobrze. , Lubię używać System.ComponentModel.DescriptionAttribute , aby dodać bardziej przyjazny opis do wartości wyliczeniowe. Przykład wyliczenia mogą być zapisane tak:

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

Zauważ, że nie należy umieszczać opisy na pozycji gdzie wersja wyświetlający poz ToString() dobrze.

+0

Dziękuję Judah za to, że próbuję to dla mnie oczyścić. Miałem trochę czasu próbując sprawić, żeby wyglądał dobrze. –

+2

Byłoby miło, gdyby ToString automatycznie używał atrybutu. Jednak nie jest to aż tak użyteczne. –

+0

Sądzę, że zawsze można użyć 'DescriptionAttribute' wraz z metodą rozszerzenia' ToDescription'. – cdmckay

9

CLR może obsłużyć dowolną postać w identyfikatorach. Jednak C# ogranicza znaki identyfikatora do tych legalnych w CLS, które to miejsce nie jest. To samo dotyczy VB.NET, nawiasem mówiąc - spacje w nawiasach kwadratowych używane do pracy w VB6, ale nie działają w VB.NET.

+0

Czy mimo to można zmodyfikować stałą wyliczenia za pomocą odbicia? – cdmckay

+0

Czy chodzi o ładowanie skompilowanego zestawu i przetwarzanie go w celu zastąpienia nazw wyliczeniowych lub modyfikowanie stałej w czasie wykonywania? Ta ostatnia nie jest możliwa; pierwsza to, ale myślę, że znacznie łatwiej byłoby użyć "ildazma", by ją zdemontować, zastąpić nazwy w razie potrzeby (można to zautomatyzować za pomocą regex), i użyć 'ilazma', aby ponownie utworzyć zespół. Alternatywnie, możesz zadeklarować swoje wyliczenie w IL, najpierw użyć "ilasm", aby skompilować je do .netmodule, a następnie połączyć ten moduł z twoim zestawem C#/VB. –

+0

Skończyłem właśnie przy użyciu "DescriptionAttribute", a następnie napisałem własną klasę statyczną, aby uzyskać dostęp do wyliczenia, tak jakby były to stałe "DescriptionAttribute". – cdmckay

0

Jeśli pracujesz z Visual C# 3.0 lub powyżej Znalazłem to wygodne, aby po prostu rozszerzenie klasy enum i używać regex wstawka przestrzenie gdzie 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); 
     })); 
    } 
} 

Wskazówka ta pozwala na pracę z dowolnym wyliczeniem bez dodawania opisów do każdej wartości.

String enumWithSpaces = MessageBoxButtons.OKCancel.ToDisplayString();