c# - 在 C# 中检测(通过反射)枚举是否为 "Flags"类型的策略

标签 c# algorithm reflection

我正在使用反射来读取程序集中的类型(以生成代码)。我可以看到一些枚举应该用 [Flags] 属性标记,但是编写这些枚举的人忘记添加这个属性。

是否有任何可靠的方法来检测枚举何时可以被视为“标志”枚举?

我目前的策略是按降序读取枚举,并检查 element(last -1) * 2 == element(last) 的值。

这在大多数情况下都很有效,除非我有具有 0、1 和 2 值的枚举(可能是标志,也可能不是标志)。


编辑:

我想检测为标志的枚举示例:

public enum EnumIsFlag1
{
    ItemA = 2,
    ItemB = 4,
    ItemC = ItemA + ItemB,
    ItemD = 32,
    ItemE = 64,
}

编辑:我的问题不是重复的...版主显然没有阅读我的问题

最佳答案

很明显,这个问题只能通过启发式方法解决,但我知道这就是你所追求的。

通常,标志枚举的大多数成员都设置了一个位。所以我会计算只设置了一位的成员的数量(例如,是 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.

可以在合法标志枚举中设置多个位的唯一原因是标志的组合。但此类枚举项的数量通常很少。

关于c# - 在 C# 中检测(通过反射)枚举是否为 "Flags"类型的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34138312/

相关文章:

c# - 设置对象的所有 bool 属性值

c# - 如何获取在 C# 中调用的先前方法的参数 IDictionary<string, object>?

c# - 附加到现有的 Excel 实例

algorithm - 二维阴影算法

c - 计算某个IP范围和时间范围内的访问次数的有效方法

ruby - 递归 self 完善

c# - 如何在其他类中赋值?

c# - 获取 HttpPostedFileBase 的文件信息

c# - 该表有一列带有复选框,需要选择该行并将行发送到另一个表。

java - Java中如何使用不同的ClassLoader重新加载已加载的类?