ti-enxame.com

Enum para String?

Eu tenho um enum definido assim

enum Tile { Empty, White, Black };

Mas vamos supor que, quando gravados no console,

Console.Write(Tile.White);

Quero que imprima

W

Ou qualquer outro valor , eu poderia usar um switch para isso, mas existe uma maneira melhor? Talvez usando atributos?


Aqui está o que eu tenho em mente. Escrevendo algo assim,

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

Imprimiria

.

Obviamente, essa override string ToString() não fez o que eu esperava que fizesse (ainda gera "Empty".


Este artigo resume muito bem: http://blogs.msdn.com/b/abhinaba/archive/2005/10/20/c-enum-and-overriding-tostring-on-it.aspx =

28
mpen

Você pode usar atributos:

using System.ComponentModel;

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

    [Description("W")]
    White,

    [Description("B")]
    Black
}

E um método auxiliar:

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

Uso:

Console.Write(Tile.Description());
49
mathieu

A maneira ingênua de não atributo:

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
17
Igor Zevaka

Você pode usar o método ToString ():

Tile t = Tile.White;
Console.WriteLine(t.ToString()); // prints "White"
Console.WriteLine(t.ToString().SubString(0, 1)); // prints "W"
16
M4N
Enum.GetName(typeof(Tile), enumvalue)

Isso obterá o enum como string.

7
abhishek

Você pode usar uma combinação de Enum.GetName e Substring.

Algo ao longo das linhas de:

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

...

Console.WriteLine(GetShortName(Tile.White));
2
Klaus Byskov Pedersen

Em Java, você faria isso (escrevi isso antes de perceber que essa é uma pergunta em C #, desculpe! Mas pode ser útil para alguém ...):

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

}

}

Resultado:

B

W

.

Branco

Isso fornece uma tradução bidirecional de e para uma enumeração.

Você não pode simplesmente imprimir Tile.White e esperar que ele imprima outra coisa, então você precisa chamar Tile.White.getAbbr (). Apenas imprimindo Tile.White chama toString () na enumeração, que imprimirá o nome. Eu acho que você pode substituir toString () se você realmente quiser:

public String toString(){
    return getAbbr();
}
0
Mick Sear

Você pode tentar o seguinte:

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

    return string.Empty;
}

E depois converta-o sempre que quiser, ligando para:

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

Espero que ajude.

0
Nuno Ramiro