【问题标题】:How to effectively validate an integer that represents a flagged enumeration?如何有效地验证表示标记枚举的整数?
【发布时间】:2012-08-11 08:38:20
【问题描述】:

考虑为按位运算设计的FileAttributes 枚举。我创建了一个系统,用户在其中选择一些复选框来确定文件的状态。一个文件可能同时是ReadOnlySystem。因此该值为 5(ReadOnly 为 1,System 为 4 四个)。

如何验证整数是否为有效的FileAttributes 枚举?

我见过这些问题,但它们对我没有帮助,因为它们不适用于按位(标记、组合)值。

Check that integer type belongs to enum member
Is there a way to check if int is legal enum in C#?

【问题讨论】:

  • 如果 any 标志组合有效,您可以简单地检查 enum 值中设置为 1 的每个位是否是有效的 enum 项(使用简单的 @ 987654332@ 和按位与)。
  • 如果你需要这样的例子,只需查看Enum.InternalFlagsFormat() 方法的源代码(你不会构建字符串,但你会检查该值是否有效)。
  • 如果由于某种原因,枚举没有精心设计怎么办?例如它没有1?在这种情况下,5 返回 true,而 1 不存在。
  • @SaeedNeanmati 您循环遍历 given 值的位。例如,如果枚举具有以下值:2、4、8,而您给出 5,那么您将做的是 a,因为这将导致 1、2、4、8 等。在这种情况下,如果 2、8 等。没有设置,所以他们会跳过。 4 是有效的,但是当您检查“1”(因为它已设置)是否是有效的枚举值时,您会发现它不是。

标签: c# validation bit-manipulation enumeration flags


【解决方案1】:
  • 计算所有合法值的累积按位“或”(可能使用 Enum.GetValues)
  • 计算“testValue & ~allValues”
  • 如果不为零,则无法通过组合合法标志来形成当前值

【讨论】:

  • 那是~ 否定运算符@Marc 吗?
  • @SaeedNamati 按位“非”/“补”
【解决方案2】:

这会奏效。基本上,如果枚举组合无效,ToString() 只会返回数字。

private bool CombinationValidForFileAttributes(int value)
{
    return ((FileAttributes)value).ToString() != value.ToString();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-07
    • 2013-01-31
    • 2011-02-02
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多