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

介绍了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)
#else
            if (!enType.GetTypeInfo().IsEnum)
#endif
                throw 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>();
#else
                var attr = enType.GetTypeInfo().GetDeclaredField(name)?.GetCustomAttribute<OSDescriptAttribute>();
#endif
                dirs.Add(resultValue, attr == null ? name : attr.Description);
            }
            enumDirs.TryAdd(key, dirs);
            return dirs.Copy();
        }

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

typeof (ResultTypes).ToEnumDirs();
时间: 2024-08-05 11:15:15

OSS.Common获取枚举字典列表标准库支持的相关文章

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

经过本周的努力,昨晚终于完成OSS.Social微信项目的标准库支持,当前项目你已经可以同时在.net framework和.net core 中进行调用,调用方法也发生了部分变化,这里我简单分享下,主要包含下边几个部分: · 移植后的变化 · 和OSS.Common,OSS.Http关系 · 异步(Task)使用介绍 一. 移植后的变化 如果不了解OSS.Social的同学,可以参看我前面的几篇文章介绍,这里就不多说了.?这次移植的变化首先是对.net core项目能够提供直接的支持,当前的使

C#记录日志、获取枚举值 等通用函数列表

using System;using System.Collections;using System.Collections.Generic;using System.ComponentModel;using System.Linq; namespace System.Web.Mvc{    #region 通用函数    /// <summary>    /// 通用函数    /// </summary>    public class Common    {        #

【C++ Primer每日刷】之三 标准库 string 类型

标准库 string 类型 string 类型支持长度可变的字符串,C++ 标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与其他的标准库类型一样,用户程序要使用 string 类型对象,必须包含相关头文件.如果提供了合适的 using 声明,那么编写出来的程序将会变得简短些: #include <string> using std::string; 1.1 string 对象的定义和初始化 string 标准库支持几个

标准库string类型

string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cnblogs.com/archimedes/p/cpp-string.html,转载请注明源地址. 引入头文件#include<string> 1.string对象的定义和初始化 string标准库支持几个构造函数,构造函数是一个特殊成员函数 一下是几种初试化string对象的方式 string s

python的标准库 ----random

在python中random是一个获取随机数的一个标准库.使用时,直接import random即可. import random print(random.random()) #返回0-1之间的随机浮点数>>>0.3025160551374695 print(random.randint(1,100)) #返回1-100之间的随机整数[1,100]>>>82 print(random.randrange(1,10,2)) #返回1-10之间的随机整数,步长=2, 联想

[sharepoint]rest api文档库文件上传,下载,拷贝,剪切,删除文件,创建文件夹,修改文件夹属性,删除文件夹,获取文档列表

写在前面 最近对文档库的知识点进行了整理,也就有了这篇文章,当时查找这些接口,并用在实践中,确实废了一些功夫,也为了让更多的人走更少的弯路. 系列文章 sharepoint环境安装过程中几点需要注意的地方 Rest API的简单应用 rest api方式实现对文档库的管理 通过WebClient模拟post上传文件到服务器 WebHttpRequest在sharepoint文档库中的使用 [sharepoint]Rest api相关知识(转) [sharepoint]根据用户名获取该用户的权限

枚举PEB获取进程模块列表

枚举进程模块的方法有很多种,常见的有枚举PEB和内存搜索法,今天,先来看看实现起来最简单的枚举PEB实现获取进程模块列表. 首先,惯例是各种繁琐的结构体定义.需要包含 ntifs.h 和 WinDef.h, 此处不再列出,各位看官根据情况自行添加. [cpp] view plain copy print? typedef PPEB (__stdcall *PFNPsGetProcessPeb)(PEPROCESS pEProcess); typedef ULONG   PPS_POST_PROC

转:Python标准库(非常经典的各种模块介绍)

Python Standard Library 翻译: Python 江湖群 10/06/07 20:10:08 编译 0.1. 关于本书 0.2. 代码约定 0.3. 关于例子 0.4. 如何联系我们 核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. exceptions 模块 1.4. os 模块 1.5. os.path 模块 1.6. stat 模块 1.7. string 模块 1.8. re 模块 1.9. math 模块 1.10. cmath 模块

Python标准库、第三方库和外部工具汇总

导读:Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据连接.数清洗转换.数据计算和统计分析.图像和视频处理.音频处理.数据挖掘/机器学习/深度学习.数据可视化.交互学习和集成开发以及其他Python协同数据工作工具. 为了区分不同对象的来源和类型,本文将在描述中通过以下方法进行标识: Python内置函数:Python自带的内置函数.函数无需导入,直接使