我想让用户输入“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