【问题标题】:Enum.TryParse returns true for any numeric valuesEnum.TryParse 对任何数值返回 true
【发布时间】:2011-07-19 02:27:04
【问题描述】:

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

如果我有一个枚举:

public enum MyEnum
{
  ValueA,
  ValueB,
  ValueC
}

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

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

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

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

【问题讨论】:

标签: c# validation enums tryparse


【解决方案1】:

这种行为是设计使然。

documentation 说:

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

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

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

【讨论】:

    【解决方案2】:

    这样使用

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

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

    【讨论】:

    • 请注意,如果您正在寻找性能方面完全优化的解决方案,Enum.IsDefined 使用反射可能会很慢。你可以在这里阅读更多信息:stackoverflow.com/a/2605417/1754152
    【解决方案3】:

    如果您想避免完全接受数字值并想避免Enum.IsDefined(),您可以在条件中添加检查以验证字符串不是数字。 There's a bunch of different ways to do that 有不同的权衡,但例如你可以这样做:

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

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      相关资源
      最近更新 更多