Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 枚举到字符串?_C# - Fatal编程技术网

C# 枚举到字符串?

C# 枚举到字符串?,c#,C#,我有一个这样定义的枚举 enum Tile { Empty, White, Black }; 但是我们假设当写入控制台时 Console.Write(Tile.White); 我要打印出来 W 或者任何其他值,我可以使用开关,但是有更好的方法吗?也许使用属性 这是我的想法。写这样的东西, [AttributeUsage(AttributeTargets.Field)] public class ReprAttribute : Attribute { public string R

我有一个这样定义的枚举

enum Tile { Empty, White, Black };
但是我们假设当写入控制台时

Console.Write(Tile.White);
我要打印出来

W
或者任何其他值,我可以使用
开关
,但是有更好的方法吗?也许使用属性


这是我的想法。写这样的东西,

[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)
将打印

.
当然,
覆盖字符串ToString()
并没有达到我希望的效果(它仍然输出“Empty”)


本文对此做了很好的总结:

您可以使用ToString()方法:


您可以使用和
子字符串的组合

大致如下:

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

...

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

您可以尝试以下方法:

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

    return string.Empty;
}
然后在每次需要时通过调用以下命令进行转换:

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

希望对您有所帮助。

您可以使用以下属性:

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

朴素的非属性方式:

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
这将以字符串的形式获取枚举。

在Java中,您可以这样做(在注意到这是一个C#问题之前编写此文件,对不起!但它可能对某些人有用……:


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

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

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 GetEnumString(this OrderStatus os)
{
    var str = OrderStatusToString[os];
    return str;
}

var str = OrderStatus.Ready.GetEnumString();
公共枚举医嘱状态
{
准备好的
生产中,
完整的
}
公共静态类关系
{
公共静态词典OrderStatusToString=新词典()
{
{OrderStatus.Ready,“Ready”},
{OrderStatus.InProduction,“生产中”},
{OrderStatus.Completed,“Completed”},
};
}
公共静态字符串GetEnumString(此OrderStatus os)
{
var str=OrderStatusToString[os];
返回str;
}
var str=OrderStatus.Ready.GetEnumString();

这与我的想法很接近……但我希望我可以删除
.Description()
位,当我尝试直接打印磁贴时,它将调用任何转换器/到字符串方法。基本上,重写
ToString()
方法,该方法的值改为从属性中获取。我将检查是否与我所追求的最接近;如果不显式调用转换方法,您似乎无法执行此操作。听起来您试图在简单枚举中填充太多内容…并试图覆盖定义良好的方法的行为。如果ff使用对象的数组/集合。可能重复
Enum.GetName(typeof(Tile), enumvalue)
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" ));

}

}
public String toString(){
    return getAbbr();
}
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 GetEnumString(this OrderStatus os)
{
    var str = OrderStatusToString[os];
    return str;
}

var str = OrderStatus.Ready.GetEnumString();