代码之家  ›  专栏  ›  技术社区  ›  mpen

枚举到字符串?

c#
  •  27
  • mpen  · 技术社区  · 14 年前

    我有一个这样定义的枚举

    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

    7 回复  |  直到 7 年前
        1
  •  49
  •   mathieu    14 年前

    您可以使用属性:

    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());
    
        2
  •  17
  •   Igor Zevaka    14 年前

    天真的非属性方式:

    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
    
        3
  •  15
  •   M4N    14 年前

    您可以使用toString()方法:

    Tile t = Tile.White;
    Console.WriteLine(t.ToString()); // prints "White"
    Console.WriteLine(t.ToString().SubString(0, 1)); // prints "W"
    
        4
  •  7
  •   abhishek    7 年前
    Enum.GetName(typeof(Tile), enumvalue)
    

    这将以字符串形式获取枚举。

        5
  •  2
  •   Klaus Byskov Pedersen    14 年前

    你可以结合使用 Enum.GetName Substring .

    沿着这条线的东西:

    private string GetShortName(Tile t)
    {
        return Enum.GetName(typeof(Tile), t).Substring(0, 1);
    }
    
    ...
    
    Console.WriteLine(GetShortName(Tile.White));
    
        6
  •  0
  •   abatishchev Marc Gravell    14 年前

    您可以尝试以下操作:

    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
  •   Bo Persson tox    12 年前

    在爪哇,你会这样做(在注意到这是一个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();
    }