3

在我的代码中,我使用了许多小的枚举:

enum UserRequest : byte { Burp=1, Sneeze=2, Fart=3 }

在将整数输入转换为此枚举之前,我经常需要对其进行验证。

bool valid_input = Enum.IsDefined(typeof(UserRequest), user_byte_value);

当枚举使用 FlagsAttribute 时,这种方法不起作用;Enum.IsDefined无法自动组合标志以生成指定值。但是,我已经能够解决不需要 FlagsAttribute 的问题。

但是,TIL 认为Eazfuscator.NET的混淆会破坏 Enum.IsDefined。我知道这是一种可能性,但我希望它不会,因为它不在 System.Reflection 命名空间中(据报道,它大量使用了 System.Reflection)。

所以我想知道是否有人知道任何好的选择。我特别关注以下内容:

  1. 允许检查整数是否在指定的枚举中。
  2. 与 .NET Framework 2.0 和 Mono 框架兼容。
  3. 无需显式禁用混淆(使用属性或某些 GUI 工具)即可幸免于难。
4

1 回答 1

2

如果其他人遇到同样的问题并找到这篇文章,我采用的解决方案是为我的每个枚举添加一个额外的枚举成员。

enum UserRequests : byte
{
    Burp = 0,
    Sneeze = 1,
    Fart = 2,
    /* Maximum Valid Value */
    MAXVAL = Fart
}

这是我记得在 C ((non-ANSI) with #defines) 中使用来迭代枚举值的一种做法,它唯一的缺点是它很难维护。

我写了一个通用函数来减轻负担(如下所示的标题);我仍然必须明确传递 MAXVAL 成员,但它的工作量比我想象的要少。当然,它可以经受住混淆并且是可移植的。

public static bool TryParseByteToEnum<T>(byte input_byte, 
    out T enum_member, T max_value) where 
        T : struct, IConvertible
于 2012-04-28T22:20:38.357 回答