(通过反射)检测C#中Enum是否为“标志”类型的策略
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了(通过反射)检测C#中Enum是否为“标志”类型的策略,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1056字,纯文字阅读大概需要2分钟。
内容图文
![(通过反射)检测C#中Enum是否为“标志”类型的策略](/upload/InfoBanner/zyjiaocheng/682/4a6897a1e9f14ced9591489395e9f773.jpg)
我正在使用反射来读取程序集中的类型(以生成代码).我可以看到应该使用[Flags]属性标记了一些枚举,但是写这些枚举的人忘记了添加此属性.
有没有可靠的方法来检测何时可以将枚举视为“标记”枚举?
目前,我的策略是按降序读取枚举,并检查element(last -1)* 2 == element(last)的值.
在大多数情况下,这很好用,除非我的枚举分别带有0、1和2值(可以是标志也可以不是标志).
编辑:
我想将其检测为标志的枚举示例:
public enum EnumIsFlag1
{
ItemA = 2,
ItemB = 4,
ItemC = ItemA + ItemB,
ItemD = 32,
ItemE = 64,
}
编辑:我的问题不是重复的…主持人显然没有阅读我的问题
解决方法:
显然,只能通过启发式方式解决此问题,但我知道这就是您所追求的.
通常,标志枚举的大多数成员都设置了单个位.因此,我将计算仅设置一个位(例如,两个的幂)的成员的数量.
然后,您可以设计一个启发式方法,例如:
//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#中Enum是否为“标志”类型的策略全部内容,希望文章能够帮你解决(通过反射)检测C#中Enum是否为“标志”类型的策略所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。