我有一个像这样定义的枚举
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 :(得分: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.GetName
和Substring
的组合。
有些事情:
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();
}