2010-05-27 21 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); }    
    }