在使用Enum.TryParse时,我遇到了一种我没想到的行为.
如果我有一个枚举:
public enum MyEnum
{
ValueA,
ValueB,
ValueC
}
Run Code Online (Sandbox Code Playgroud)
然后我将一个数值(作为一个字符串)传递给Enum.TryParse,如:
MyEnum outputEnum;
bool result = Enum.TryParse("1234", out outputEnum);
Run Code Online (Sandbox Code Playgroud)
尽管字符串"1234"不是可能的值,但结果将返回true,而我的outputEnum将具有值1234.
有没有办法可以避免这种行为?我正在尝试编写一个函数,它将任意字符串输入作为枚举处理,这在我的错误输入检测中引发了一些麻烦.
关于如何转换枚举以及如果解析的值超出范围会发生什么,还有一些其他问题,例如:
public enum SomeTypes
{
SomeType1 = 1,
SomeType2 = 2,
SomeType3 = 3
}
public class SomeClass
{
...
var inRange = (SomeTypes) 1;
var outOfRange = (SomeTypes) 5;
...
}
Run Code Online (Sandbox Code Playgroud)
超出范围不会产生任何错误。但是我发现如果您尝试使用超出范围的值序列化-反序列化枚举,您会遇到奇怪的错误。例如,我得到了类似的东西
“错误解析消息或超时”
这让我一直在寻找枚举超出范围之外的其他原因。
处理此问题的建议是通过Enum.IsDefined
. 这似乎工作得很好,但是在msdn上有一个相当大胆的警告:
“不要使用 System.Enum.IsDefined(System.Type,System.Object) 进行枚举范围检查,因为它基于枚举的运行时类型,该类型可能会因版本而异。”
所以,我的问题是,我们可以安全地使用Enum.IsDefined
或检查枚举的值是否超出范围而不使用Enum.IsDefined
?
考虑FileAttributes
为按位运算设计的枚举.我创建了一个系统,用户可以在其中选择一些复选框来确定文件的状态.文件可以是ReadOnly
和System
.因此,该值将是5(1 ReadOnly
和4 System
).
如何验证整数是否为有效FileAttributes
枚举?
我已经看到了这些问题,但它们并没有帮助我,因为它们不适用于bitwised(标记,组合)值.