我想讓用戶輸入「Sun」並且代表「1」。枚舉可以代表字符串數字嗎?
Console.Write("Enter a Day: ");
day = Console.ReadLine();
can enum do this?
我想讓用戶輸入「Sun」並且代表「1」。枚舉可以代表字符串數字嗎?
Console.Write("Enter a Day: ");
day = Console.ReadLine();
can enum do this?
是的。
enum Days { Sun = 1, /*...*/ }
string day = Console.ReadLine();
Days d = (Days)Enum.Parse(typeof(Days), day);
是 - 你可以使用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!
}
沒有施法,你可以不小心使用它在非枚舉類型。 (還有其他各種東西在項目過程中,...原文解析等)
如果你有一個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); }
}
加一個純粹的無償插頭:),當然你的答案是正確的 – Pharabus 2010-05-27 19:12:10