首页 > 编程语言 >在C#中使用Attributes(特性)来控制枚举成员是否应该被序列化或映射

在C#中使用Attributes(特性)来控制枚举成员是否应该被序列化或映射

时间:2023-04-12 14:25:37浏览次数:46  
标签:EnumIteratorIgnoreAttribute 迭代 C# 成员 特性 枚举 foreach Attributes 序列化

如果标记了[NonSerialized]特性,会防止将该字段序列化。但是,该字段仍然可以用于foreach迭代,因为它仍然是枚举的有效成员。
如果要防止特定枚举成员被foreach迭代,用[NonSerialized]特性是不起作用的。相反,可以创建一个自定义的Attribute继承自System.Attribute,并将其应用到需要隐藏的枚举成员上。在枚举上使用[Flags]特性也将防止它被foreach迭代。
以下是一个示例,防止枚举成员被foreach迭代:

[Flags]
public enum SampleEnum
{
    abc,
    def,
    [EnumIteratorIgnore]
    efg
}

[AttributeUsage(AttributeTargets.Field)]
public class EnumIteratorIgnoreAttribute : Attribute { }

public static IEnumerable<SampleEnum> GetEnumValues()
{
    foreach (SampleEnum e in Enum.GetValues(typeof(SampleEnum)))
    {
        if (e.GetType()
             .GetField(e.ToString())
             .GetCustomAttributes(typeof(EnumIteratorIgnoreAttribute), true)
             .Length == 0)
        {
            yield return e;
        }
    }
}

 

在这个示例中,SampleEnum类型被标记为[Flags],这意味着它是一个位标记,不能直接用于foreach迭代。此外,egf枚举成员上定义了一个自定义的EnumIteratorIgnoreAttribute特性,该特性将防止该成员被迭代。
在枚举类型上定义了一个GetEnumValues()方法,该方法遍历枚举类型的所有值,并使用反射来查找每个值的自定义特性。如果枚举值上未发现EnumIteratorIgnoreAttribute特性,则枚举值将被yield返回,否则将被忽略。
因此,在foreach循环中使用GetEnumValues()方法来获取枚举类型的所有值,而忽略在枚举成员上定义了EnumIteratorIgnoreAttribute特性的值。

标签:EnumIteratorIgnoreAttribute,迭代,C#,成员,特性,枚举,foreach,Attributes,序列化
From: https://www.cnblogs.com/tx1185498724/p/17309620.html

相关文章

  • TCP协议
    TCP协议的特点:TCP是面向连接(虚连接),是一种点对点的连接。每一条TCP只能有两个端点。TCP连接是可靠的交付,无差错、不丢失、不重复、按顺序到达。TCP提供全双工通信(双向通信)。因此发送方和接受方都会有发送缓存和接收缓存。发送缓存:准备发送的数据&已发送但尚未确认的数据。接......
  • 论文解析 -- A Systematic Mapping Study in AIOps
    AIOPS论文的综述如何挑选论文,如何选取keywords 搜索的3个论文库, Weselectthreeonlinesearchdatabasesthatareappropriateforthescopeofinvestigation:IEEEXplore,ACMDigitalLibraryandarXiv. 对于挑选出的论文进行分类,分类标准是,targetcomponents......
  • mac-m1安装jmeter详细步骤
    mac-m1安装jmeter详细步骤查看jdk安装路径:/usr/libexec/java_home-V修改jmeter的java路径vim/opt/homebrew/Cellar/jmeter/5.4.1/bin/jmeter修改java环境变量,jmeter需要给赋值写的权限,chmod+wjmeter修改成当前java的执行路径安装后的路径是:/opt/homebrew/Cellar/jmeter......
  • Centos 升级Openssl 版本修复漏洞
    一、服务器环境CentOS版本:CentOSLinuxrelease7.6.1810(Core)默认的OpenSSL版本:opensslversion提示如下:OpenSSL1.0.2k-fips26Jan2017二、升级教程1、下载最新版的OpenSSL下载地址:命令如下:cd~wgethttps://www.openssl.org/source/openssl-1.1.1l.tar.gz......
  • 在CentOS上安装Docker引擎
    1,先决条件####1-1操作系统要求1-2卸载旧版本2,安装方法2-1使用存储库安装设置存储库安装Docker引擎本文永久更新地址:官方地址:https://docs.docker.com/engine/install/centos/1,先决条件####1-1操作系统要求要安装DockerEngine,您需要以下CentOS版本......
  • 在docker安装Python环境提供给其他docker使用
    1.在宿主机新建一个目录2.在app目录下新建一个Dockerfile文件本文永久更新地址:1.在宿主机新建一个目录在宿主机上新建一个目录如app/,在app目录里面导入项目需要依赖的包在项目根目录下输入命令,导出python项目所有的依赖包pipfreeze>requirements.txt把导出的re......
  • PAT Basic 1089. 狼人杀-简单版
    PATBasic1089.狼人杀-简单版1.题目描述:以下文字摘自《灵机一动·好玩的数学》:“狼人杀”游戏分为狼人、好人两大阵营。在一局“狼人杀”游戏中,1号玩家说:“2号是狼人”,2号玩家说:“3号是好人”,3号玩家说:“4号是狼人”,4号玩家说:“5号是好人”,5号玩家说:“4号是好人”......
  • 17-springcloud-ribbon-3-Ribbon 负载均衡策略
    Ribbon的负载均衡策略是由IRule接口定义,该接口由如下实现:在jar包:com.netflix.ribbon#ribbon-loadbalancer中;  要使用ribbon实现负载均衡,在Spring的配置类里面把对应的负载均衡接口实现类作为一个Bean配置一下就行了;负载均衡的入口:ILoadBalancer接口如果要切换负载......
  • 用Abp实现两步验证(Two-Factor Authentication,2FA)登录(二):Vue网页端开发
    @目录发送验证码登录退出登录界面控件获取用户信息功能项目地址前端代码的框架采用vue.js+elementUI这套较为简单的方式实现,以及typescript语法更方便阅读。首先添加全局对象:loginForm:登录表单对象twoFactorData:两步验证数据,showTwoFactorSuccess:是否显示两步验证成......
  • Java中ThreadLocal的用法和原理
    用法隔离各个线程间的数据避免线程内每个方法都进行传参,线程内的所有方法都可以直接获取到ThreadLocal中管理的对象。packagecom.example.test1.service;importorg.springframework.scheduling.annotation.Async;importorg.springframework.stereotype.Component;imp......