枚举到字符串?

时间:2010-09-02 08:09:37

标签: c#

我有一个像这样定义的枚举

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

8 个答案:

答案 0 :(得分: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());

答案 1 :(得分:17)

天真的非属性方式:

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

答案 2 :(得分:15)

您可以使用ToString()方法:

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

答案 3 :(得分:7)

Enum.GetName(typeof(Tile), enumvalue)

这将使枚举成为字符串。

答案 4 :(得分:2)

您可以使用Enum.GetNameSubstring的组合。

有些事情:

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

...

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

答案 5 :(得分:1)

我建议结合使用枚举静态词典(以及扩展方法)。

它将避免(昂贵的)反射,并具有干净的结构。您可以进一步优化命名以使其更加方便。

public enum OrderStatus
{
    Ready,
    InProduction,
    Completed
}

public static class EnumRelations
{
    public static Dictionary<OrderStatus, string> OrderStatusToString = new Dictionary<OrderStatus, string>()
    {
        { OrderStatus.Ready, "Ready" },
        { OrderStatus.InProduction, "In Production" },
        { OrderStatus.Completed, "Completed" },
    };
}

public static string GetOrderStatusString(this OrderStatus os)
{
    var str = OrderStatusToString[os];
    return str;
}

var str = OrderStatus.Ready.GetOrderStatusString();

答案 6 :(得分: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));

希望有所帮助。

答案 7 :(得分: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" ));

}

}

输出:

w ^

这使您可以在枚举中进行双向转换。

你不能只打印Tile.White并期望它打印别的东西,所以你需要调用Tile.White.getAbbr()。只需打印Tile.White就会在枚举上调用toString(),这将打印出名称。我猜你可以覆盖toString(),如果你真的想要:

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