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