我希望用户输入“Sun”并将其表示为“1”。
Console.Write("Enter a Day: ");
day = Console.ReadLine();
可以这样做吗?
答案 0 :(得分:8)
是
enum Days { Sun = 1, /*...*/ }
string day = Console.ReadLine();
Days d = (Days)Enum.Parse(typeof(Days), day);
答案 1 :(得分:4)
是的 - 您可以使用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!
}
没有强制转换,您不能在非枚举类型上意外使用它。 (项目中有各种其他好东西,当然......描述解析等。)
答案 2 :(得分:1)
如果您有enum
,请说:
enum SkyObjects
{
Sun = 1,
Star = 2
}
然后您可以拥有以下内容:
SkyObjects day = Enum.Parse(typeof(SkyObjects ), Console.ReadLine());
这将Sun
,代表1
。
答案 3 :(得分: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); }
}