我使用反射来读取程序集中的类型(以生成代码)。我可以看到一些枚举应该标有[Flags]
属性,但编写这些枚举的人忘记添加此属性。
有没有可靠的方法来检测枚举何时可以被视为“标志”枚举?
我目前的策略是按降序读取枚举,并检查 element(last -1) * 2 == element(last) 的值。
这在大多数情况下都非常有效,除非我的枚举具有 0、1 和 2 值(可能是标志,也可能不是标志)。
edit:
我想检测为标志的枚举示例:
public enum EnumIsFlag1
{
ItemA = 2,
ItemB = 4,
ItemC = ItemA + ItemB,
ItemD = 32,
ItemE = 64,
}
edit: 我的问题不是重复的...主持人显然没有阅读我的问题
显然,这个问题只能通过启发式解决,但我明白这就是您所追求的。
通常,标志枚举的大多数成员都设置了一位。因此,我会计算仅设置了一位的成员数量(例如,是 2 的幂)。
然后,您可以设计一种启发式方法,例如:
//Is this a flags enum?
var totalCount = ...;
var powerOfTwoCount = ...;
if (totalCount < 3) return false; //Can't decide.
if (powerOfTwoCount >= totalCount * 0.95) return true; //Looks like flags
//Probably need some cases for small values of totalCount.
可以在合法标志枚举中设置多个位的唯一原因是标志的组合。但此类枚举项的数量通常很少。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)