2010-09-02 18 views
25

Mam enum zdefiniowane następującoEnum to String?

enum Tile { Empty, White, Black }; 

Ale załóżmy, gdy zapisywane na konsoli

Console.Write(Tile.White); 

chcę go wydrukować

W 

lub jakikolwiek inny wartość, mógłbym użyć do tego celu switch, ale czy jest tam ładniejszy sposób? Być może używając atrybutów?


Oto, co mam na myśli. Pisząc coś takiego,

[AttributeUsage(AttributeTargets.Field)] 
public class ReprAttribute : Attribute 
{ 
    public string Representation; 
    public ReprAttribute(string representation) 
    { 
     this.Representation = representation; 
    } 
    public override string ToString() 
    { 
     return this.Representation; 
    } 
} 

enum Tile { 
    [Repr(".")] 
    Empty, 
    [Repr("W")] 
    White, 
    [Repr("B")] 
    Black 
}; 

// ... 
Console.Write(Tile.Empty) 

wydrukuje

. 

oczywiście, że override string ToString() nie robić to, co ja ufałem to zrobić (to nadal wyprowadza "Empty" zamiast.


Ten artykuł podsumowuje to całkiem dobrze: http://blogs.msdn.com/b/abhinaba/archive/2005/10/20/c-enum-and-overriding-tostring-on-it.aspx

+0

Może więc powinieneś być bardziej konkretny w przyszłości, nie możemy czytać w myślach. –

+0

@Arkain: I nie mogę przewidzieć, jak również mnie zinterpretujesz. To, co jest jasne w twoim umyśle, nie zawsze jest jasne w czyjejś osobie. Czy próbowałeś kiedyś rozmawiać z klientem? – mpen

+0

Zamiast szyderstwa, określ swoje wymagania tak jasno, jak dzień;) Nie rób miejsca na interpretację. –

Odpowiedz

49

można użyć atrybuty:

using System.ComponentModel; 

public enum Tile 
{ 
    [Description("E")] 
    Empty, 

    [Description("W")] 
    White, 

    [Description("B")] 
    Black 
} 

i metoda pomocnika:

public static class ReflectionHelpers 
{ 
    public static string GetCustomDescription(object objEnum) 
    { 
     var fi = objEnum.GetType().GetField(objEnum.ToString()); 
     var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 
     return (attributes.Length > 0) ? attributes[0].Description : objEnum.ToString(); 
    } 

    public static string Description(this Enum value) 
    { 
     return GetCustomDescription(value); 
    } 
} 

Zastosowanie:

Console.Write(Tile.Description()); 
+0

To jest zbliżone do tego, co miałem na myśli ... ale miałem nadzieję, że mogę upuścić '.Description()' bit, i to po prostu wywołaj dowolną metodę konwertera/łańcucha, gdy spróbuję bezpośrednio wydrukować kafelek. Zasadniczo, przesłonięcie metody 'ToString()' wartością uzyskaną z atrybutu. – mpen

+0

Dam ci czek na bycie najbliżej tego, po czym byłam; wygląda na to, że nie możesz tego zrobić bez jawnego wywoływania metody konwersji. – mpen

10

Można użyć metody toString():

Tile t = Tile.White; 
Console.WriteLine(t.ToString()); // prints "White" 
Console.WriteLine(t.ToString().SubString(0, 1)); // prints "W" 
2

można użyć kombinacji Enum.GetName i Substring.

Coś wzdłuż linii:

private string GetShortName(Tile t) 
{ 
    return Enum.GetName(typeof(Tile), t).Substring(0, 1); 
} 

... 

Console.WriteLine(GetShortName(Tile.White)); 
0

Można spróbować wykonać następujące czynności:

private string GetFirstEnumLetter(Tile tile) 
{ 
    if (tile.ToString().Length > 0) 
    { 
     return tile.ToString().Substring(0, 1); 
    } 

    return string.Empty; 
} 

a następnie przekształcić go za każdym razem, gdy chcesz dzwoniąc:

Console.Write(GetFirstEnumLetter(Tile.White)); 

nadzieja, że pomaga.

15

Naiwny sposób non-atrybut:

public enum Tile { 
    White = 'W', 
    Black = 'B' 
} 
//... 
System.Diagnostics.Debug.WriteLine(string.Format("{0} - {1}", Tile.White.ToString(), (char)Tile.White)); 
//Prints out: 
//White - W 
4
Enum.GetName(typeof(Tile), enumvalue) 

Spowoduje to wyliczenie jako ciąg.

0

W Javie zrobiłbyś to (napisałeś to zanim zauważysz, że jest to pytanie C#, przepraszam! Ale może to być przydatne dla kogoś ...)

public enum Tile { 

    Empty ("."), White ("W"), Black ("B") ; 

    private String abbr; 

     //Note this is private 
    private Tile (String abbr) { 

     this.abbr = abbr; 
    } 

    public String getAbbr() { 

     return abbr; 
    } 

     //The following is only necessary if you need to get an enum type for an abbreviation 
    private static final Map<String, Tile> lookup = new HashMap<String, Tile>(); 

    static { 
     for (Tile t : EnumSet.allOf(Tile.class)) 
      lookup.put(t.getAbbr(), t); 
    } 

    public static Tile get (String abbr) { 

     return lookup.get(abbr); 
    } 
} 

public class TestTile { 

public static void main (String[] args) { 

    System.out.println(Tile.Black.getAbbr()); 
    System.out.println(Tile.White.getAbbr()); 
    System.out.println(Tile.Empty.getAbbr()); 

    System.out.println(Tile.get("W")); 

} 

} 

wyjściowa:

B

W

.

Biały

Daje to tłumaczenie 2-drożny do iz wyliczenia.

Nie możesz po prostu wydrukować Tile.White i oczekiwać, że wydrukuje coś innego, więc musisz zadzwonić do Tile.White.getAbbr(). Wystarczy wydrukować Tile.White wywoła metodę toString() w wyliczeniu, które wydrukuje nazwę. Sądzę, że możesz przesłonić toString(), jeśli naprawdę chcesz:

public String toString(){ 
    return getAbbr(); 
}