2010-09-02 3 views
25

У меня есть перечисление, определенный как этотEnum to String?

enum Tile { Empty, White, Black }; 

Но давайте предположим, что при записи на консоли,

Console.Write(Tile.White); 

Я хочу, чтобы напечатать

W 

или любой другой значение, я мог бы использовать switch для этого, но есть ли лучший способ? Возможно, используя атрибуты?


Вот что я имею в виду. Дать что-то вроде этого,

[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) 

печати Будет

. 

Конечно, что override string ToString() не делать то, что я надеялся, что это будет делать (он по-прежнему выводит «Пустой» вместо этого.


Эта статья очень хорошо описывает ее: http://blogs.msdn.com/b/abhinaba/archive/2005/10/20/c-enum-and-overriding-tostring-on-it.aspx

+0

Тогда, возможно, вы должны быть более конкретными в будущем, мы не можем читать мысли. –

+0

@Arkain: И я не могу предсказать, как вы меня истолковываете. То, что ясно в твоем сознании, не всегда ясно в чьем-то. Вы когда-нибудь пробовали разговаривать с клиентом? – mpen

+0

Вместо того, чтобы получать snide, укажите ваши требования так же ясно, как день;) Не допускайте места для интерпретации. –

ответ

49

Вы могли бы использовать атрибуты:

using System.ComponentModel; 

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

    [Description("W")] 
    White, 

    [Description("B")] 
    Black 
} 

И метод помощника:

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

Использование:

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

Это близко к тому, что я имел в виду ... но я надеялся, что смогу '.Description()' bit, и он просто вызовет любой метод конвертер/в строку, когда я попытаюсь напрямую распечатать фрагмент. В принципе, переопределение метода ToString() 'со значением, которое оно получает из атрибута. – mpen

+0

Я дам вам чек, чтобы быть ближе всего к тому, что я был после; кажется, что вы не можете сделать это без явного вызова метода преобразования. – mpen

10

Вы можете использовать метод ToString():

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

Вы можете использовать комбинацию Enum.GetName и Substring.

Что-то вдоль линий:

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

... 

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

Вы можете попробовать следующее:

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

    return string.Empty; 
} 

А затем преобразовать его каждый раз, когда вы хотите по телефону:

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

Надежда, что помогает.

15

Наивный способ без атрибута:

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) 

Это приведет к перечислению в виде строки.

0

В Java вы бы это сделали (написано это, прежде чем замечать, что это вопрос на C#, извините! Но это может быть полезно кому-то ...):

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

} 

} 

Выход:

В

Вт

.

Белый

Это дает 2-полосная перевод в и из перечисления.

Вы не можете просто распечатать Tile.White и ожидать, что он напечатает что-то еще, поэтому вам нужно вызвать Tile.White.getAbbr(). Просто печать Tile.White вызовет toString() в перечислении, который будет печатать имя. Я думаю, вы могли бы переопределить toString(), если вы действительно захотите:

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