上篇(.Net Standard扩展支持实例分享)介绍了OSS.Common的标准库支持扩展,也列举了可能遇到问题的解决方案。由于时间有限,同时.net standard暂时还没有提供对DescriptionAttribute的支持,所以其中的转化枚举到字典列表的扩展当时按照第一种处理方式先行屏蔽,这次按照第三种方式完善一下。

  既然.net standard 下没有提供对DescriptAttribute的支持,首先我先自定义一个Attribute来补充:

    [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]            public class OSDescriptAttribute : Attribute{                public OSDescriptAttribute(string description){                    this.Description = description;}                    public string Description { get; set; }}

  其次定义一个线程安全的字典,来全局缓存枚举对应的枚举字典列表,减少下次获取的代码执行:

     private static ConcurrentDictionary<string, Dictionary<string, string>> enumDirs       =new ConcurrentDictionary<string, Dictionary<string, string>>();

  最后我们来实现获取字典部分的具体操作:

        public static Dictionary<string, string> ToEnumDirs(this Type enType,                           bool isIntValue = true){#if NETFW            if (!enType.IsEnum)#elseif (!enType.GetTypeInfo().IsEnum)#endifthrow new ArgumentException("获取枚举字典,参数必须是枚举类型!");            string key = string.Concat(enType.FullName, isIntValue);Dictionary<string, string> dirs;enumDirs.TryGetValue(key, out dirs);                    if (dirs != null)                          return dirs.Copy();dirs = new Dictionary<string, string>();                    var values = Enum.GetValues(enType);                      foreach (var value in values){                             var name = Enum.GetName(enType, value);                        string resultValue = isIntValue ? ((int) value).ToString() : value.ToString()           ;#if NETFW                           var attr = enType.GetField(name)?.GetCustomAttribute<OSDescriptAttribute>();             #elsevar attr = enType.GetTypeInfo().GetDeclaredField(name)?.GetCustomAttribute<OSDescriptAttribute>();#endifdirs.Add(resultValue, attr == null ? name : attr.Description);}enumDirs.TryAdd(key, dirs);                    return dirs.Copy();}

以后我们就可以在所有的业务的代码中进行  typeof(枚举类型).ToEnumDirs()  的方法来获取枚举对应的字典列表,例如:

typeof (ResultTypes).ToEnumDirs();

如有其它疑问,欢迎关注公众号(osscoder):原文地址:http://www.cnblogs.com/sunhoy/p/6388528.html

.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

OSS.Common获取枚举字典列表标准库支持相关推荐

  1. STM32 HAL库获取系统时钟与标准库获取系统时钟

    HAL库 SysClk = HAL_RCC_GetSysClockFreq();     HClk = HAL_RCC_GetHCLKFreq();     PClk1 = HAL_RCC_GetPC ...

  2. [Objc]_[获取Mac下的字体库支持的所有字体名称]

    场景: 1.假如你向做自己的字体管理界面时,这样就需要获取支持的所有字体名字. 2.objc的强大之处是它可以和C++混合编程,这是其他语言所不具备的.这里使用了ATS Service接口.ATS(A ...

  3. OSS.Social微信项目标准库介绍

    经过本周的努力,昨晚终于完成OSS.Social微信项目的标准库支持,当前项目你已经可以同时在.net framework和.net core 中进行调用,调用方法也发生了部分变化,这里我简单分享下, ...

  4. 完成OSS.Http底层HttpClient重构封装 支持标准库

    OSS.Http项目对于.Net Standard标准库的支持已经迁移完毕,OSS开源系列两个最底层的类库已经具备跨运行时支持的能力.由于OSS.Http类库是几年前我参照RestSharp的思路,完 ...

  5. STM32标准库与HAL库中的Mode和Pull设置

    目录 概述 HAL库 标准库 再看HAL库 概述 最近做SDK的BSP驱动.之前使用STM32CubeMX进行开发,设计GPIO的初始化接口包括了mode.pull两个参数. 现在对接另一款国产芯片, ...

  6. 基于STM8L15x-16x-05x系列单片机的官方标准库文件创建第一个EWSTM8工程项目

    本博文主要内容是手把手给大家创建项目的工程模板:单片机基于STM8L15x-16x-05x系列,编译环境基于IAR Embedded Workbench for STM8 IDE (EWSTM8).废 ...

  7. 不同平台的C/C++标准库

    1. C/C++标准 C/C++所涉及到的参与者,根据角色的不同,可以分为以下3类: C/C++标准起草者,主要在ISO标准组织( International Organization for Sta ...

  8. 技术分享 | 使用 C++20 Ranges 标准库实现日历程序

    作者 | 罗能(知乎 id:@netcan) 整理 | 编程语言 Lab 花了我 3 个晚上才搞定,结论是目前 C++ 的 Ranges 标准库 [1] 对于实现 复杂的程序还不够用 ,提供的 vie ...

  9. python groupby用法_Python 标准库实践之合并字典组成的列表

    作者 | 陈祥安 来源 | Python学习开发 最近做了个数据合并的需求这里记录下: 要求如下: dict_of_list1 = [{"name": "zhangsan ...

最新文章

  1. 毕业季:理想很丰满,现实也可以很丰满!
  2. 2015_8_21作业——有自翻译有复制他人的英语太差
  3. sata接口_SATA接口成瓶颈 PCIe硬盘爆发: 群联主控增长120%
  4. java面试题3(java基础)
  5. [Issue Fixed]-GCC编译[-Werror,-Wformat]
  6. pwn学习总结(一) —— 常用命令
  7. PHP用空格分割文本为数组的方法
  8. 查询去除空值_SQL数据处理(五):SQL多表查询
  9. python 类继承 父类初始化_python之子类继承父类时进行初始化的一些问题
  10. jmeter连接mysql数据库驱动_十八、JMeter实战-JDBC连接MySQL数据库
  11. java中for 的几种常见用法
  12. PHP与MySQL设计模式:代理模式
  13. spring 注解_Spring 注解编程之 AnnotationMetadata
  14. -1.#IND,1.#INF 的判断
  15. CAD .Net 开发-快速入门
  16. php清除页面别人挂的马
  17. Scanner的.next()以及.nextLine()各自代表什么意思
  18. 【VBS】vbs鼠标方法——模拟鼠标按键
  19. 基于直方图的图像全局二值化算法原理、实现--基于谷底最小值的阈值
  20. 广东省新型数据中心发展白皮书

热门文章

  1. 图片加载框架Picasso - 源码分析
  2. log4net日志插件的使用
  3. imx6 i2c分析
  4. 把nc v6的源码看懂
  5. 通过电话号码获取姓名 (+86或者飞信)
  6. WPF实现拟物旋转按钮
  7. 微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版
  8. 使用EF Core操作层次结构数据
  9. 听说你刚转了Java?准备转回.NET吧!
  10. 如何在C#中使用 ArrayPool,MemoryPool