对于任何数值,Enum.TryParse 都返回 true

我在使用 Enum.TryParse 时遇到了一个意想不到的行为。

如果我有枚举:

public enum MyEnum
{
ValueA,
ValueB,
ValueC
}

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

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

尽管字符串“1234”不是一个可能的值,result 将返回 true,而我的 outputEnum 的值将为1234。

有什么办法能让我避免这种行为吗?我正在尝试编写一个函数,它将处理任意字符串输入作为枚举,这对我的错误输入检测来说有点棘手。

14921 次浏览

这种行为是设计好的。

文件表示:

. If value is the string representation of an integer that does not represent an underlying value of the TEnum enumeration, the method returns an enumeration member whose underlying value is value converted to an integral type. If this behavior is undesirable, call the IsDefined method to ensure that a particular string representation of an integer is actually a member of TEnum.

调用 Enum.IsDefined来验证您解析的值是否实际存在于这个特定的 enum中。

如果您处理的是 [Flags]枚举(位掩码) ,那么它将变得更加复杂。

像这样使用它

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

Result 的值将为 false,但 outputEnum 的值仍然是1234

如果希望避免完全接受数值并避免使用 Enum.IsDefined(),可以向条件添加检查以验证字符串是否为数值。有很多不同的方法具有不同的权衡,但是,例如,您可以这样做:

string valueToParse = "1234";
bool result = !valueToParse.All(char.IsDigit) && Enum.TryParse(valueToParse, out MyEnum outputEnum);