OSS.Common获取枚举字典列表标准库支持
上篇(.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)
#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();
代码详见:github
如果你对OSS开源系列有兴趣,欢饮关注公号(osscoder):

OSS.Common获取枚举字典列表标准库支持的更多相关文章
- c++ 11开始语言本身和标准库支持并发编程
c++ 11开始语言本身和标准库支持并发编程,意味着真正要到编译器从语言和标准库层面开始稳定,估计得到17标准出来.14稳定之后的事情了,根据历史经验,新特性的引入到稳定被广泛采用至少要一个大版本的跨 ...
- C#记录日志、获取枚举值 等通用函数列表
) { ] >= && ipvals[] <= && ipval ...
- 完成OSS.Http底层HttpClient重构封装 支持标准库
OSS.Http项目对于.Net Standard标准库的支持已经迁移完毕,OSS开源系列两个最底层的类库已经具备跨运行时支持的能力.由于OSS.Http类库是几年前我参照RestSharp的思路,完 ...
- OSS.Social微信项目标准库介绍
经过本周的努力,昨晚终于完成OSS.Social微信项目的标准库支持,当前项目你已经可以同时在.net framework和.net core 中进行调用,调用方法也发生了部分变化,这里我简单分享下, ...
- 【C++ Primer每日刷】之三 标准库 string 类型
标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...
- C++标准库string类型
string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cn ...
- 枚举PEB获取进程模块列表
枚举进程模块的方法有很多种,常见的有枚举PEB和内存搜索法,今天,先来看看实现起来最简单的枚举PEB实现获取进程模块列表. 首先,惯例是各种繁琐的结构体定义.需要包含 ntifs.h 和 WinDef ...
- 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列
支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...
- [sharepoint]rest api文档库文件上传,下载,拷贝,剪切,删除文件,创建文件夹,修改文件夹属性,删除文件夹,获取文档列表
写在前面 最近对文档库的知识点进行了整理,也就有了这篇文章,当时查找这些接口,并用在实践中,确实废了一些功夫,也为了让更多的人走更少的弯路. 系列文章 sharepoint环境安装过程中几点需要注意的 ...
随机推荐
- 模块之字节编译的.pyc文件---from.import语句
字节编译的.pyc文件输入一个模块相对来说是一个比较费时的事情,所以Python做了一些技巧,以便使输入模块更加快一些.一种方法是创建 字节编译的文件 ,这些文件以.pyc作为扩展名.字节编译的文件与 ...
- 7、手把手教你Extjs5(七)自定义菜单1
顶部和底部区域已经作好,在顶部区域有一个菜单的按钮,这一节我们设计一个菜单的数据结构,使其可以展示出不同样式的菜单.由于准备搭建的是一个系统模块自定义的系统,因此菜单也是自定义的,在操作员系统登录的时 ...
- mysql的 charset、collation、prefix了解
charset,即字符集. collation,用于指定数据集如何排序,以及字符串的比对规则,即排序规则. prefix,即数据库里表使用的前缀. /************************* ...
- 100套新鲜免费的PS笔刷下载
这篇文章所有的Photoshop笔刷都是免费且高质量的.笔刷总类齐全:有飞鸟.冰块.水.树枝.喷墨.科技元素.皮肤纹理.烟火等等!用它们来加速你的工作流程,提升作品档次吧!”一挪妖娆举动,一刷风情万种 ...
- StackExchange.Redis 官方文档(四) KeysScan
KEYS, SCAN, FLUSHDB 方法在哪? 经常有人问这些问题: 好像并没有看到 Keys(...) 或者 Scan(...)方法?那我要怎么查询数据库里面存有哪些key? 或者 好像没有Fl ...
- shell 整理,更新,记录
菜鸟级awk,读取android manifest,把key->value 保存到path.rc. awk -F "name=" '{if(/project path/) p ...
- http://begin.lydsy.com/JudgeOnline/problem.php?id=2774(poi病毒)
2774: Poi2000 病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 5 Solved: 4[Submit][Status][Web Boa ...
- linux 脚本保留日志
使用tee使屏幕和文件都输出日志. 2 >&1中 2是错误输出,1是标准输出, 2>&1是标准和错误一起输出. repo sync 2>&1 | tee -a ...
- Java语言中IO流的操作规律学习笔记
1,明确源和目的. 数据源:就是需要读取,可以使用两个体系:InputStream.Reader: 数据汇:就是需要写入,可以使用两个体系:OutputStream.Writer: 总结: 读:就是把 ...
- iOS 之 自动释放池
向一个对象发送autorelease消息时,cocoa会将该对象的一个引用放入最新的自动释放池.作用域结束时,自动释放池会被释放,池中所有的对象也就被释放了.