[英]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.