簡體   English   中英

枚舉可以表示字符串數字嗎?

[英]Can enum represent string numbers?

我希望用戶輸入“Sun”並將其表示為“1”。

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

可以這樣做嗎?

是。

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

string day = Console.ReadLine();

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

是的 - 您可以使用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!
}

沒有轉換,你不能在非枚舉類型上意外使用它。 (項目中有各種其他好東西,當然......描述解析等)

如果你有一個enum ,讓我們說:

enum SkyObjects
{
   Sun = 1,
   Star = 2
}

然后,您可以擁有以下內容:

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

這將有Sun ,表示為1你喜歡。

或者,...另一個不可變值類型結構的候選者“顯示為”和“行為”類似於枚舉,但具有域模型關注所需的其他功能...使用下面定義的類型,您可以編寫

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM