66

在使用 Enum.TryParse 时,我遇到了一种我没有预料到的行为。

如果我有一个枚举:

public enum MyEnum
{
  ValueA,
  ValueB,
  ValueC
}

然后我将一个数值(作为字符串)传递给 Enum.TryParse,例如:

MyEnum outputEnum;
bool result = Enum.TryParse("1234", out outputEnum);

尽管字符串“1234”不是可能的值,但结果将返回为真,并且我的 outputEnum 的值为 1234。

有没有办法可以避免这种行为?我正在尝试编写一个函数,它将任意字符串输入作为枚举处理,这在我的错误输入检测中引发了一些麻烦。

4

3 回答 3

87

此行为是设计使然。

文档说:

. 如果 value 是不表示 TEnum 枚举的基础值的整数的字符串表示形式,则该方法返回一个枚举成员,其基础值是转换为整数类型的值。如果不希望出现这种行为,请调用 IsDefined 方法以确保整数的特定字符串表示实际上是 TEnum 的成员。

调用Enum.IsDefined以验证您解析的值实际上存在于这个特定的enum.

如果您正在处理[Flags]枚举(位掩码),它会变得更加复杂。

于 2011-07-19T02:29:37.253 回答
5

像这样使用它

bool result = Enum.TryParse("1234", out MyEnum outputEnum) && Enum.IsDefined(typeof(MyEnum), outputEnum);

result 的值为 false 但 outputEnum 的值仍为 1234

于 2020-05-30T14:40:48.007 回答
0

如果您想避免完全接受数字值并想避免Enum.IsDefined(),您可以在条件中添加检查以验证字符串不是数字。有很多不同的方法可以通过不同的权衡来做到这一点,但是,例如,你可以这样做:

string valueToParse = "1234";
bool result = !valueToParse.All(char.IsDigit) && Enum.TryParse(valueToParse, out MyEnum outputEnum);
于 2021-11-09T11:27:34.850 回答