我有一个课程MyClass
,其中有
public enum Days{Mon, Tue, Wed}
然后是一个字段
public Days dayOfWeek;
我的解决方案中的另一个类的字符串(myString
)值为0
,1
或2
。我想设置MyClass
的{{1}})字段myClassInstance
等于dayOfWeek
的实例,myStringvalue
表示Mon,0
意思是星期二......
我试过了
1
和
myClassInstance.dayOfWeek = Convert.ToInt32(myString)
但是没有工作。我确信这很简单。为什么这些技术不起作用?
答案 0 :(得分:9)
尝试
string s = "0";
Days day = (Days)Enum.Parse(typeof(Days), s);
或
string s = "0";
Days day;
if(!Enum.TryParse(s, out day)) {
// error handling
}
优雅地处理无法将s
解析为Days
实例的情况。
这适用于Enum.Parse
的文档
将名称的字符串表示形式或一个或多个枚举常量的数值转换为等效的枚举对象。
此外,您可以检查string
的实例是否实际上表示枚举通过
string s = "3";
bool defined = Enum.IsDefined(typeof(Days), s);
// defined is false
在这种情况下, Enum.Parse
将盲目地解析s
,即使它不代表枚举Days
定义的值和Enum.Parse
结果中的强制转换到Days
不会失败。
此外,还有一个代表星期几的内置枚举。这个枚举是System.DayOfWeek
。我建议使用它。
最后,如果由于某种原因您无法使用System.DayOfWeek
,则至少应将您的枚举重命名为Day
而不是Days
(删除复数)。只有表示标志的枚举应该是复数。请注意,上面的变量day
代表一天,并不代表天数。这就是你应该将枚举重命名为Day
的原因。这与大多数C#和.NET程序员使用的naming conventions一致。
答案 1 :(得分:6)
转换后,您只需将int
转换为Days
枚举:
myClassInstance.dayOfWeek = (Days)Convert.ToInt32(myString);
您还可以使用Enum.TryParse
(如果您使用的是.NET 4)或Enum.Parse
。根据您对传入数据的信任程度,您可能还需要调用Enum.IsDefined
以确保整数的有效值为Days
(否则,在所有这些情况下,您将拥有Days
的实例,与您的任何命名值都不对应。)
Days dayOfWeek;
if (!Enum.TryParse(myString, out dayOfWeek)) {
dayOfWeek = Days.Mon; // or some other default, or throw
}
myClassInstance.dayOfWeek = dayOfWeek;
或者
myClassInstance.dayOfWeek = (Days)Enum.Parse(typeof(Days), myString);
此外,正如其他人所提到的,如果匹配您真正想要的内容,您可能需要考虑使用内置的DayOfWeek
枚举而不是自定义版本。
此外,正如其他人再次提到的,即使它没有提到,Day
是基于.NET命名准则的更好的名称,因为它不是Flags
枚举。
答案 2 :(得分:2)
尝试
myClassInstance.dayOfWeek = (Days)int.Parse(myString);
您知道已经有一个可以重新使用的枚举名为DayOfWeek
(http://msdn.microsoft.com/en-us/library/system.dayofweek.aspx)
答案 3 :(得分:2)
答案 4 :(得分:0)
您需要将int
转换为Days
:
myClassInstance.dayOfWeek = (Days)Convert.ToInt32(myString);
答案 5 :(得分:0)
你想要做的是将字符串转换为int(如果你想以一种很好的方式做到的话,可以使用tryparse)
然后使用以下代码设置枚举值:
(Days)Enum.ToObject(typeof(Days),intValue);
答案 6 :(得分:0)