2010-05-27 22 views

回答

8

是的。

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

string day = Console.ReadLine(); 

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

是 - 你可以使用Enum.Parse(和Enum.TryParse为.NET 4中)将字符串解析到一个枚举值:

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! 
} 

没有施法,你可以不小心使用它在非枚举类型。 (还有其他各种东西在项目过程中,...原文解析等)

+0

加一个纯粹的无偿插头:),当然你的答案是正确的 – Pharabus 2010-05-27 19:12:10

1

如果你有一个enum,让说:

enum SkyObjects 
{ 
    Sun = 1, 
    Star = 2 
} 

然后,您可以有以下几种:

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

这将有Sun,表示为1,只要你喜欢。

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