2013-06-21 16 views
10

Jak mogę mieć aC# enum, że gdybym wybrał ciąg zwraca inny ciąg, podobnie jak w Javie można to zrobić przez wyjścieChange display enum

public enum sample{ 
    some, other, things; 

    public string toString(){ 
     switch(this){ 
      case some: return "you choose some"; 
      default: break; 
     } 
    } 
} 

Console.writeln(sample.some) będzie:

you choose some 

Po prostu chcę, aby moje wyliczenia zwracały inny ciąg znaków, gdy próbuję je wywoływać.

+0

Co pan spróbować? Lub gdzie to się nie udaje? – Kangkan

+2

@Kangkan - ponieważ nie można wywodzić się z wyliczenia w języku C#, nie ma niczego, co można bezpośrednio wypróbować ... –

Odpowiedz

12

Według mojej wiedzy nie jest to możliwe. Można jednak napisać metodę rozszerzenia że dostaje jakiś inny napis:

public static class EnumExtensions 
{ 
    public static string ToSampleString(this SampleEnum enum) 
    { 
     switch(enum) 
     { 
      case SampleEnum.Value1 : return "Foo"; 
      etc. 
     } 
    } 
} 

Teraz wystarczy zadzwonić tej nowej ToSampleString na wystąpień SampleEnum:

mySampleEnum.ToSampleString(); 

Jeśli nie jesteś zaznajomiony z metod rozszerzenie w C#, czytaj więcej here.

Inną opcją jest użycie atrybutu Description powyżej każdej wartości enum, zgodnie z opisem here.

+0

Można użyć kombinacji opisu na klasie wyliczeniowej, a także wartości wyliczeniowej, aby utworzyć ogólną wiadomość zdefiniowaną raz. , z metodą rozszerzenia, aby skomponować ją razem.Uczyniłoby to metodę wielokrotnego użytku wielokrotnego użytku. +1 – Phill

+1

Dlaczego pobieranie Atrybutu opisu jest tak skomplikowane? – CodeCamper

+1

Uzyskiwanie atrybutu Opis jest tylko raz skomplikowane. Dodajesz ją jako metodę rozszerzenia i jest ona dostępna dla wszystkich Emali i już na nią nie patrzysz. Korzystając z powyższej odpowiedzi, musisz stworzyć taką metodę dla każdego Enum. Możesz spojrzeć na ładny przykład: http://weblogs.asp.net/stefansedich/archive/2008/03/12/enum-with-string-values-in-c.aspx –

3

Chcesz słownik. Wylicznik wylicza (podaje liczbę) dla swoich wartości. Chcesz, aby wartość łańcucha była zwracana, gdy podasz klucz łańcucha. Spróbuj czegoś takiego:

Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
dictionary.Add("some", "you choose some"); 
dictionary.Add("other", "you choose other"); 
dictionary.Add("things", "you choose things"); 

Wtedy ten kod:

string value = dictionary["some"]; 
Console.writeln(value); 

powróci „wybrać jakiś”

0

Jeśli chcesz po prostu dostać Enum jako ciąg można użyć tej metody:

Enum.GetName(typeof(sample), value); 

Ta metoda zwróci nazwę Enum zamiast int.

4

Uczyniłbym to dekoracyjnie, tworząc atrybut np. Opis i dekorowanie wartości wyliczeniowych za jego pomocą.

np.

public enum Rate 
{ 
    [Description("Flat Rate")] 
    Flat, 
    [Description("Time and Materials")] 
    TM 
} 

Następnie użyj GetCustomAttributes, aby odczytać/wyświetlić wartości. http://msdn.microsoft.com/en-us/library/system.attribute.getcustomattributes.aspx

@CodeCamper Przepraszam za opóźnienie w odpowiedzi, ale Oto przykładowy kod do zapoznania się z DescriptionAttribute: metodę

rozszerzenia:

public static class EnumExtensions 
{ 
    public static string Description<T>(this T t) 
    { 
     var descriptionAttribute = (DescriptionAttribute) typeof (T).GetMember(t.ToString()) 
            .First().GetCustomAttribute(typeof (DescriptionAttribute)); 

     return descriptionAttribute == null ? "" : descriptionAttribute.Description; 
    } 
} 

Zastosowanie:

Rate currentRate = Rate.TM; 
Console.WriteLine(currentRate.Description()); 
+0

Czytałem artykuły o tym, jak to zrobić i z jakiegoś powodu wydaje się to zbyt skomplikowane. Czy możesz pokazać najprostszy i najmniejszy wiersz kodu, aby pobrać opis? – CodeCamper

+0

@CodeCamper Dodałem przykładowy kod do powyższej odpowiedzi. – lahsrah

+0

Dziękujemy za dodanie! +1 – CodeCamper