C# 枚举类型自动转换为字符串?

17

有没有可能让编译器自动将我的枚举值转换为字符串,这样我就可以避免每次都显式地调用ToString方法。以下是我想要实现的示例:

enum Rank { A, B, C }

Rank myRank = Rank.A;
string myString = Rank.A; // Error: Cannot implicitly convert type 'Rank' to 'string'
string myString2 = Rank.A.ToString(); // OK: but is extra work

15
很遗憾,编程需要大量的打字,所以你只能逐渐习惯它。 - Dean Harding
哦,对于枚举类型我不太确定,但对于类,您可以使用隐式操作符。http://msdn.microsoft.com/zh-cn/library/85w54y0a.aspx - Cory Charlton
5
你的回答很有趣。不知道你怎么想,但我开始编写代码只是因为我很懒,想要让使用电脑更加容易(例如:Shell脚本自动化、简单的批处理文件等)。问如何使某事更容易是一个完全合理的问题。 - Cory Charlton
3
@Cory:有懒散,也有“极度懒散”。编写shell脚本以使生活更轻松是好的,但为了节省11个字符而规避类型系统是不好的。 - Dean Harding
6个回答

11

不行。枚举类型是自己的类型,所以如果你想将其转换为其他类型,就需要进行一些操作。

但是,根据你对它执行的操作不同,有些方法会自动调用ToString()。例如,你可以这样做:

Console.Writeline(Rank.A);

好的,只是我的一厢情愿而已。 - dcompiled
7
只是为了明确,Console.WriteLine 没有特别之处,它仅有一个可接受对象的重载,并将枚举类型装箱为对象后传递,然后 WriteLine 方法调用了该对象的 ToString 方法。 - Dean Harding
1
@dcompiled - 如果您感到好奇,那么您可以编写自己的隐式转换运算符,将枚举类型转换为字符串! http://www.csharphelp.com/2006/10/type-conversion-and-conversion-operators-in-c/ - Mike Atlas
也许我错了,但我认为不可能编写自己的隐式转换,枚举不是类,因此您无法向其添加方法。 - Robert Noack

10

你可能不是在寻找枚举本身,而是字符串常量列表。在某些情况下,它可以更好地满足您的需求。

请使用以下内容代替:


请使用以下内容代替:

public static class Rank
{
   public const string A = "A";
   public const string B = "B";
   public const string C = "C";
}

这种解决方案的问题在于传递的类型是一个字符串。调用者仍然可以传递任何他们想要的字符串。 - Ryan Pedersen

1

不是,但至少你可以使用枚举来调用它们的ToString()方法,以便在需要使用它们的字符串值时执行操作,例如:

Console.WriteLine(Rank.A); //prints "A".

1

正确的语法应该是

myRank.ToString("F");

0

[注意,黑客攻击] 不确定是否危险,对我来说似乎是一个合理的妥协。

var myEnumAsString = MyEnum+""; Console.WriteLine(myEnumAsString); //MyEnum

这将强制隐式 ToString()


0
这个问题很多年前就被问过了,但是不管怎样...
这里有一个非常简单的方法可以从枚举中获取一个字符串数组:
public static string[] EnumToStr<T>() where T : Enum
{
    return Enum.GetNames(typeof(T));
}

只需这样使用:
public enum Test
{
    alpha,
    beta,
    gamma
}

var test_str = EnumToStr<Test>();

foreach (var name in test_str)
     Console.WriteLine(name);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接