2015-10-14 4 views
1

Итак, я работаю с перечислениями в первый раз на C#, но я не думаю, что это будет продолжаться, поскольку я просто понял, что у вас есть гибкость, как у вас на Java.Расширенные перечисления в C#

Например, эквивалент того, что я хочу сделать в Java будет выглядеть примерно так:

public enum Days { 
    Mon("Monday"), Tue("Tuesday"), Wed("Wednesday"), Thu("Thursday", 93), Fri, Sat("Saturday", 44), Sun; 

    private String longName; 
    private int other; 

    Days() {} 
    Days(String longName) { 
     this.longName = longName; 
    } 
    Day(String longName, int somethingElse) { 
     this(longName); 
     this.other = somethingElse; 
    } 

    @Override 
    public String toString() { 
     return this.longName + ", " + this.other; 
    } 
} 

Есть в любом случае я могу сделать это в C#? Насколько я могу судить, с перечислениями вы можете сделать только что-то вроде следующего:

public enum Days { Mon=1, Tue=2, Wed=3 } 

Это не имеет строго быть перечисление, просто действовать как перечисление Java.

+0

Вы можете использовать пользовательские атрибуты. – crashmstr

+0

Итак, вы хотите, чтобы каждое значение перечисления называлось длинным именем? –

+1

Перечисления Java и C# выглядят одинаково, но они совершенно разные: перечисления Java являются, по существу, классами, где каждая константа перечисления является экземпляром. Переписи C, напротив, являются константами порядкового типа, такими как 'int'. –

ответ

1

Ну вы можете добавить имя в отображения на перечисление:

public enum Days { 
    [Display(Name = "Monday")] 
    Mon=1, 

    [Display(Name = "Tuesday")] 
    Tue=2, 

    [Display(Name = "Wednesday")] 
    Wed=3 
} 

, но это только метаданные. Вы не можете добавить реализацию к ним, как вы (по-видимому), в Java.

Вы могли использовать класс со статическими свойствами только для чтения:

public class Days { 

    private String longName; 
    private int other; 

    Days() {} 
    Days(String longName) 
    { 
     this.longName = longName; 
    } 
    Days(String longName, int somethingElse) 
     : this(longName) 
    { 
     this.other = somethingElse; 
    } 

    public override String ToString() 
    { 
     return this.longName + ", " + this.other; 
    } 

    // just an example - in reality you'd probably want to keep one instance for each property in a static dictionary. 
    public static Days Mon {get{return new Days("Monday",1);}} 
    public static Days Tue {get{return new Days("Tuesday",2);}} 
    // etc. 

} 

Но есть существенные различия между ним и «истинным» перечислением.

+0

Это отлично работает до тех пор, пока кто-то попросит вас интернационализировать его;) –

+0

Поэтому у меня не может быть куча полей для каждого из разных значений и классов ... Отлично:/ – Spedwards

+1

@MatthewWatson вы всегда можете использовать '[ Display (Name = "labelForName", ResourceType = typeof (Resources.Resources))] 'перегрузка этого атрибута. –

0
public enum Days 
{ 
    MON =1, 
    TUE=2, 
    WED=3, 
    THUR=4, 
    FRI=5, 
    SAT=6, 
    SUN=7 
} 

public static class EnumTypeExtensions 
{ 
    public static string FriendlyString(this Days day) 
    { 
     switch (day) 
     { 
      case Days.MON: 
       return "Monday"; 
Смежные вопросы