[英]Casting string value to enumerated value C#
我有一个类MyClass
public enum Days{Mon, Tue, Wed}
然后是一个领域
public Days dayOfWeek;
从在我的解决方案的另一个I类有一个字符串( myString
的要么)值0
, 1
或2
。 我想将MyClass
(称为myClassInstance
)字段dayOfWeek
的实例设置为等于myStringvalue
这样0
表示Mon, 1
表示Tue ...
我努力了
myClassInstance.dayOfWeek = Convert.ToInt32(myString)
和
myClassInstance.dayOfWeek = (int) myString
但都不起作用。 我敢肯定这很简单。 这些技术为什么不起作用?
尝试
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程序员使用的命名约定一致。
您只需将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
枚举。
尝试
myClassInstance.dayOfWeek = (Days)int.Parse(myString);
您是否知道已经有一个可以重用的枚举,称为DayOfWeek
( http://msdn.microsoft.com/zh-cn/library/system.dayofweek.aspx )
您需要将int
为Days
:
myClassInstance.dayOfWeek = (Days)Convert.ToInt32(myString);
您要执行的操作是将字符串转换为int格式(如果想要以一种不错的方式进行操作,则可以尝试使用tryparse)
然后使用以下代码设置枚举值:
(天)Enum.ToObject(typeof(天),intValue);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.