在我的代码中,我使用了许多小枚举:
enum UserRequest : byte { Burp=1, Sneeze=2, Fart=3 }
我经常需要在将整数输入转换为此枚举之前对其进行验证。
bool valid_input = Enum.IsDefined(typeof(UserRequest), user_byte_value);
当enum使用FlagsAttribute时,此方法不起作用; Enum.IsDefined无法自动组合标志以生成指定值。但是,我已经能够解决不需要FlagsAttribute的问题。
然而,TIL Eazfuscator.NET的混淆打破了Enum.IsDefined。我知道这是一种可能性,但我希望它不会,因为它不在System.Reflection命名空间中(据报道,它大量使用System.Reflection)。
所以我想知道是否有人知道任何好的选择。我特别关注以下内容:
答案 0 :(得分:2)
如果其他人遇到同样的问题,并且发现了这篇文章,那么我使用的解决方案就是为每个枚举添加一个额外的枚举成员。
enum UserRequests : byte
{
Burp = 0,
Sneeze = 1,
Fart = 2,
/* Maximum Valid Value */
MAXVAL = Fart
}
这是我记得在C((非ANSI)和#defines中使用迭代枚举值的一种做法,它唯一的缺点是难以维护。
我写了一个通用函数来教导负担(如下所示);我仍然必须明确地传递MAXVAL成员,但它的工作量比我想象的少。当然,它可以在混淆中存活并且可以移植。
public static bool TryParseByteToEnum<T>(byte input_byte,
out T enum_member, T max_value) where
T : struct, IConvertible