枚举值为string

有谁知道如何获得枚举值的string?

例:

private static void PullReviews(string action, HttpContext context) { switch (action) { case ProductReviewType.Good.ToString(): PullGoodReviews(context); break; case ProductReviewType.Bad.ToString(): PullBadReviews(context); break; } } 

编辑:

当试图使用ToString(); 编译器抱怨,因为case语句期望一个常量。 我也知道,ToString()是在intellisense中用一条直线敲出来的

是的,您可以使用.ToString()获取一个枚举的string值,但不能在switch语句中使用.ToString() 。 Switch语句需要常量expression式,而.ToString()不会在运行时计算,所以编译器会抛出一个错误。

为了得到你想要的行为,只要改变方法,你可以使用enum.Parse()actionstring转换为一个枚举值,然后切换该枚举值。 从.NET 4开始,你可以使用Enum.TryParse()来做错误检查和处理,而不是在开关体中。

如果是我,我会parsingstring到一个枚举值并打开,而不是打开string。

 private static void PullReviews(string action, HttpContext context) { ProductReviewType review; //there is an optional boolean flag to specify ignore case if(!Enum.TryParse(action,out review)) { //throw bad enum parse } switch (review) { case ProductReviewType.Good: PullGoodReviews(context); break; case ProductReviewType.Bad: PullBadReviews(context); break; default: //throw unhandled enum type } } 

你正在倒退。 不要试图使用dynamicstring作为案例标签(你不能),而是将stringparsing为一个枚举值:

 private static void PullReviews(string action, HttpContext context) { // Enum.Parse() may throw if input is invalid, consider TryParse() in .NET 4 ProductReviewType actionType = (ProductReviewType)Enum.Parse(typeof(ProductReviewType), action); switch (actionType) { case ProductReviewType.Good: PullGoodReviews(context); break; case ProductReviewType.Bad: PullBadReviews(context); break; default: // consider a default case for other possible values... throw new ArgumentException("action"); } } 

编辑:原则上,你可以比较你的switch语句中的硬编码的string(见下面),但这是最不可取的方法,因为当你改变传入方法的值或者定义的枚举。 我加了这个,因为值得知道,string可以用作案例标签,只要它们是编译时文字即可 。 dynamic值不能用作实例,因为编译器不知道它们。

 // DON'T DO THIS...PLEASE, FOR YOUR OWN SAKE... switch (action) { case "Good": PullGoodReviews(context); break; case "Bad": PullBadReviews(context); break; } 
 public enum Color { Red } var color = Color.Red; var colorName = Enum.GetName(color.GetType(), color); // Red 

编辑:或者也许你想..

 Enum.Parse(typeof(Color), "Red", true /*ignorecase*/); // Color.Red 

没有TryParse for枚举,所以如果你期望错误,你必须使用try / catch:

 try { Enum.Parse(typeof(Color), "Red", true /*ignorecase*/); } catch( ArgumentException ) { // no enum found } 

这个代码会工作。

 private enum ProductReviewType{good, bad}; private static void PullReviews(string action) { string goodAction = Enum.GetName(typeof(ProductReviewType), ProductReviewType.good); string badAction = Enum.GetName(typeof(ProductReviewType), ProductReviewType.bad); if (action == goodAction) { PullGoodReviews(); } else if (action == badAction) { PullBadReviews(); } } public static void PullGoodReviews() { Console.WriteLine("GOOD Review!"); } public static void PullBadReviews() { Console.WriteLine("BAD Review..."); } 

由于被parsing的string不是常量,所以不能被Switch语句使用。 编译在VS2005中

您可以使用另一个临时variables来保存types的枚举类,这可能会提高性能。

我build议你去另一种方式 – 尝试尽可能多地使用实际的枚举值(通过将string转换为枚举值,尽快 ),而不是在应用程序周围传递string:

 ProductReviewType actionType = (ProductReviewType)Enum.Parse(typeof(ProductReviewType), val); // You might want to add some error handling here. PullReviews(actionType); private static void PullReviews(ProductReviewType action, HttpContext context) { switch (action) { case ProductReviewType.Good: PullGoodReviews(context); break; case ProductReviewType.Bad: PullBadReviews(context); break; } } 

请注意,我已经更改您的方法签名以接受ProductReviewType参数; 这就清楚了你的方法实际需要什么来实现它的逻辑,并且符合我原来的观点,你应该尽可能的不要传递string。

这只是为了它的乐趣,但如果你使用代表字典呢? 我意识到你有一个完全不同的方法,但字典化可能实际上更好地为你想要完成的工作,特别是因为它提供了高度的模块化,而不是mondo-switch结构(尽pipe我必须承认,你的枚举只有2个成员,所以它是一个模拟问题)。 无论如何,我只是想用不同的方式去做事情…

基于字典的方法将如下所示:

 namespace ConsoleApplication1 { public enum ProductReviewType { Good, Bad } public static class StringToEnumHelper { public static ProductReviewType ToProductReviewType(this string target) { // just let the framework throw an exception if the parse doesn't work return (ProductReviewType)Enum.Parse( typeof(ProductReviewType), target); } } class Program { delegate void ReviewHandler(HttpContext context); static readonly Dictionary<ProductReviewType, ReviewHandler> pullReviewOperations = new Dictionary<ProductReviewType, ReviewHandler>() { {ProductReviewType.Good, new ReviewHandler(PullGoodReviews)}, {ProductReviewType.Bad, new ReviewHandler(PullBadReviews)} }; private static void PullGoodReviews(HttpContext context) { // actual logic goes here... Console.WriteLine("Good"); } private static void PullBadReviews(HttpContext context) { // actual logic goes here... Console.WriteLine("Bad"); } private static void PullReviews(string action, HttpContext context) { pullReviewOperations[action.ToProductReviewType()](context); } static void Main(string[] args) { string s = "Good"; pullReviewOperations[s.ToProductReviewType()](null); s = "Bad"; pullReviewOperations[s.ToProductReviewType()](null); // pause program execution to review results... Console.WriteLine("Press enter to exit"); Console.ReadLine(); } } }