将字符串值转换为枚举值C#

0 c# enums casting .net-3.5

我有一类MyClass具有

public enum Days{Mon, Tue, Wed}
Run Code Online (Sandbox Code Playgroud)

然后是一个领域

public Days dayOfWeek;
Run Code Online (Sandbox Code Playgroud)

从我的解决方案中的另一个类,我有一个string(myString)值0,1或者2.我想设置一个MyClass's(被调用myClassInstance)字段的实例dayOfWeek等于myStringvalue0意味着Mon,1意味着Tue ......

我试过了

myClassInstance.dayOfWeek = Convert.ToInt32(myString)
Run Code Online (Sandbox Code Playgroud)

myClassInstance.dayOfWeek = (int) myString
Run Code Online (Sandbox Code Playgroud)

但都没有工作.我确信这很简单.为什么这些技术不起作用?

jas*_*son 9

尝试

string s = "0";
Days day = (Days)Enum.Parse(typeof(Days), s);
Run Code Online (Sandbox Code Playgroud)

要么

string s = "0";
Days day;
if(!Enum.TryParse(s, out day)) {
    // error handling
}
Run Code Online (Sandbox Code Playgroud)

优雅地处理s无法解析为实例的情况Days.

这适用于Enum.Parse各州的文件

一个或多个枚举常量名称或数值的字符串表示形式转换为等效的枚举对象.

此外,您可以检查实例是否string实际表示由enum via定义的值

string s = "3";
bool defined = Enum.IsDefined(typeof(Days), s);
// defined is false
Run Code Online (Sandbox Code Playgroud)

Enum.Parses在这种情况下会盲目解析,即使它不代表枚举定义的值,Days并且结果的Enum.Parse转换Days也不会失败.

此外,还有一个代表星期几的内置枚举.这个枚举是System.DayOfWeek.我建议用这个.

最后,如果由于某种原因你不能使用System.DayOfWeek,你应该至少重命名你的枚举Day而不是Days(删除复数).只有表示标志的枚举应该是复数.请注意,day上面的变量代表一天,并不代表天数.这就是你应该将枚举重命名为的原因Day.这与大多数C#和.NET程序员使用的命名约定一致.


bdu*_*kes 6

转换后你只需要转换intDays枚举:

myClassInstance.dayOfWeek = (Days)Convert.ToInt32(myString);
Run Code Online (Sandbox Code Playgroud)

您也可以使用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;
Run Code Online (Sandbox Code Playgroud)

要么

myClassInstance.dayOfWeek = (Days)Enum.Parse(typeof(Days), myString);
Run Code Online (Sandbox Code Playgroud)

此外,正如其他人所提到的DayOfWeek,如果它与您真正想要的匹配,您可能需要考虑使用内置枚举而不是自定义版本.

此外,正如其他人再次提到的那样,即使它没有提到,Day也是基于.NET命名准则的更好的名称,因为它不是Flags枚举.