枚举可以表示字符串数字吗?

时间:2010-05-27 18:59:48

标签: c#

我希望用户输入“Sun”并将其表示为“1”。

Console.Write("Enter a Day: ");
day = Console.ReadLine();

可以这样做吗?

4 个答案:

答案 0 :(得分:8)

enum Days { Sun = 1, /*...*/ }

string day = Console.ReadLine();

Days d = (Days)Enum.Parse(typeof(Days), day);

答案 1 :(得分:4)

是的 - 您可以使用Enum.Parse(以及.NET 4中的Enum.TryParse)将字符串解析为枚举值:

Day day = (Day) Enum.Parse(typeof(Day), "Sun");

Day day;
if (Enum.TryParse<Day>("Sun", out day))
{
    // Success!
}

它仍然有些难看,请注意 - 第一次调用涉及一定数量的转换,第二次调用不会阻止您尝试解析任何值类型。

我不喜欢Parse / TryParse的最后一个原因是它们将解析枚举数值的字符串表示 - 所以“1”会成功解析,即使它很清楚不是枚举值的名称。这对我来说似乎有点笨拙。

如果使用Unconstrained Melody这是一个更好的(IMO!)方法,我编写的一个小型开源项目允许带有枚举约束的泛型。然后你就有了:

Day day = Enums.ParseName<Day>("Sun");

Day day;
if (Enums.TryParseName<Day>("Sun", out day))
{
    // Success!
}

没有强制转换,您不能在非枚举类型上意外使用它。 (项目中有各种其他好东西,当然......描述解析等。)

答案 2 :(得分:1)

如果您有enum,请说:

enum SkyObjects
{
   Sun = 1,
   Star = 2
}

然后您可以拥有以下内容:

SkyObjects day = Enum.Parse(typeof(SkyObjects ), Console.ReadLine());

这将Sun,代表1

答案 3 :(得分:0)

或者,......另一个候选者,一个不可变值类型结构,“显示为”和“行为”就像一个枚举,但具有你的域模型关注所需的额外功能...使用下面定义的类型你可以写

 var myDay = (InPutDay)"Sunday"; 

或,......

 int x = (int)InPutDay.Sun;

,或者

int x = (int) InputDay.Parse("Sunday");

使用此类型:

   public struct InPutDay
   {
       private int val;
       private bool isDef;
       private InPutDay( )  { } // private to prevent direct instantiation 
       private InPutDay(int value) { id=value; isDef = true; } 

       public bool HasValue { get { return isDef; } } 
       public bool isNull{ get { return !isDef; } } 

       public static InPutDay Null = new InPutDay(); 
       public static InPutDay Sun = new InPutDay(1); 
       public static InPutDay Mon = new InPutDay(2); 
       public static InPutDay Tue = new InPutDay(3); 
       public static InPutDay Wed = new InPutDay(4); 
       public static InPutDay Thu = new InPutDay(5); 
       public static InPutDay Fri = new InPutDay(6); 
       public static InPutDay Sat = new InPutDay(7); 

       public static InPutDay Parse(string s)
       {
           switch (s.ToUpper().Substring(0,3))
           {
               case "SUN": return InPutDay.Sun;
               case "MON": return InPutDay.Mon;
               case "TUE": return InPutDay.Tue;
               case "WED": return InPutDay.Wed;
               case "THU": return InPutDay.Thu;
               case "FRI": return InPutDay.Fri;
               case "SAT": return InPutDay.Sat;
               default return InPutDay.Null;
           }
       }
       public static implicit operator int(InPutDay inDay)
       { return val; }
       public static explicit operator InPutDay (int inDay)
       { 
           if (inDay > 0 && inDay < 8)
              return new InPutDay(inDay);
           // either throw exception ....
           throw new ArgumentException(
               "InPutDay integer values must be between 1 and 7.");
           // or return null instance
           return InPutDay.Null;
       }
       public static explicit operator InPutDay (string inDayName)
       {  return InPutDay.Parse(inDayName); }               
  }