通过重写 class 的 ToString() 来简化获取 enum 的 DescriptionAttribute 值
通过重写 class 的 ToString() 来简化获取 enum 的 DescriptionAttribute 值
目录
一、常见的 enum 类型
新建一个 AlgorithmType 枚举,里面包含 MD5、SHA1 和 SHA2 等一系列的枚举值,默认为 int 类型。有的时候我们会在对应的枚举值上使用特性 [Description] 来添加备注信息,方便我们后期提供描述信息(如返回给前端界面展示时可能需要使用)。
AlgorithmType.cs
/// <summary>
/// 算法类型
/// </summary>
public enum AlgorithmType
{
/// <summary>
/// MD5
/// </summary>
[Description("Message-Digest Algorithm 5")]
MD5, /// <summary>
/// SHA1
/// </summary>
[Description("Secure Hash Algorithm 1")]
SHA1, /// <summary>
/// SHA224
/// </summary>
[Description("Secure Hash Algorithm 224")]
SHA224, /// <summary>
/// SHA256
/// </summary>
[Description("Secure Hash Algorithm 256")]
SHA256, /// <summary>
/// SHA384
/// </summary>
[Description("Secure Hash Algorithm 384")]
SHA384, /// <summary>
/// SHA512
/// </summary>
[Description("Secure Hash Algorithm 512")]
SHA512
}
常见的一个做法是,编写一个扩展方法来获取 enum 的描述信息:
public static class EnumExtensionMethods
{
/// <summary>
/// 获取枚举类型的描述信息
/// </summary>
public static string GetDescription(this Enum value)
{
var type = value.GetType();
var name = Enum.GetName(type, value); if (name == null) return null; var field = type.GetField(name); if (!(Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute attribute))
{
return name;
} return attribute.Description;
}
}
因为直接输出枚举值,或者通过枚举类型对应的 ToString() 的方式输出字符串,结果都为它本身的文本值,BCL 也并没有提供快捷的方式去获取描述信息,所以只能通过类似上述的扩展方法来获取 [DescriptionAttribute]。
【分析】因为枚举属于值类型,它不需要在堆上分配空间,并且在计算时(如比较运算)效率相比引用类型更高,所以从性能上枚举类型是占据了绝对的优势;但是由于 BCL 并没有提供快捷方式的去获取 [Description],并且编写对应的获取方法也较为麻烦(其实也不麻烦,因为你会使用程序员的两大法宝:CTRL+C 和 CTRL+V)。
二、演变:class 版本的 enum 类型
这次我们不直接使用 enum,而是采取新建 class 的方式去模仿 enum 类型,也就是使用引用类型来取代值类型,不过,性能方面会有所损耗。
HashAlgorithmType.cs
/// <summary>
/// 哈希算法类型
/// </summary>
public class HashAlgorithmType
{
/// <summary>
/// MD5
/// </summary>
public static readonly HashAlgorithmType MD5 = new HashAlgorithmType(); /// <summary>
/// SHA1
/// </summary>
public static readonly HashAlgorithmType SHA1 = new HashAlgorithmType(); /// <summary>
/// SHA224
/// </summary>
public static readonly HashAlgorithmType SHA224 = new HashAlgorithmType(); /// <summary>
/// SHA256
/// </summary>
public static readonly HashAlgorithmType SHA256 = new HashAlgorithmType(); /// <summary>
/// SHA384
/// </summary>
public static readonly HashAlgorithmType SHA384 = new HashAlgorithmType(); /// <summary>
/// SHA512
/// </summary>
public static readonly HashAlgorithmType SHA512 = new HashAlgorithmType(); private readonly int _hashAlgorithmType; private HashAlgorithmType(int hashAlgorithmType)
{
_hashAlgorithmType = hashAlgorithmType;
} public override string ToString()
{
string result; switch (_hashAlgorithmType)
{
case :
result = "Message-Digest Algorithm 5";
break;
case :
result = "Secure Hash Algorithm 1";
break;
case :
result = "Secure Hash Algorithm 224";
break;
case :
result = "Secure Hash Algorithm 256";
break;
case :
result = "Secure Hash Algorithm 384";
break;
case :
result = "Secure Hash Algorithm 512";
break;
default:
throw new Exception("哈希算法类型有误");
} return result;
}
}
我们采用了 private 进行构造函数私有化的操作,这样就不会允许在类的外部 new 对象了;其次,使用 public static readonly 字段提供给外部进行访问,这样的话就和枚举类型的调用方式一致;最后,我们对 ToString() 方法进行了重写,在 return 的值中返回对应的描述信息。
这样,我们就可以直接通过 class.field 的方式得到对应枚举值的描述信息。
【分析】性能受损;但 ToString() 比 GetDescription() 更浅显直白、清晰明了;不过,参数以数字“写死”的方式进行提供也欠妥。
三、演进:class 和 enum 两者共存的版本
在上一个版本的类中,我们在进行构造函数初始化时直接使用了数字 0~5,并且重写 ToString() 时也是直接使用数字 0~5,除了不直观的因素之外,随着枚举值数量的增加,枚举值和自身描述两者间的对应关系也容易出错。现在,我们尝试以私有嵌套类的形式将 enum 和 class 的两者有机结合起来。
HashAlgorithmType.cs
/// <summary>
/// 哈希算法类型
/// </summary>
public class HashAlgorithmType
{
/// <summary>
/// MD5
/// </summary>
public static HashAlgorithmType MD5 = new HashAlgorithmType(AlgorithmType.MD5); /// <summary>
/// SHA1
/// </summary>
public static readonly HashAlgorithmType SHA1 = new HashAlgorithmType(AlgorithmType.SHA1); /// <summary>
/// SHA224
/// </summary>
public static readonly HashAlgorithmType SHA224 = new HashAlgorithmType(AlgorithmType.SHA224); /// <summary>
/// SHA256
/// </summary>
public static readonly HashAlgorithmType SHA256 = new HashAlgorithmType(AlgorithmType.SHA256); /// <summary>
/// SHA384
/// </summary>
public static readonly HashAlgorithmType SHA384 = new HashAlgorithmType(AlgorithmType.SHA384); /// <summary>
/// SHA512
/// </summary>
public static readonly HashAlgorithmType SHA512 = new HashAlgorithmType(AlgorithmType.SHA512); /// <summary>
/// 算法类型
/// </summary>
private readonly AlgorithmType _algorithmType; private HashAlgorithmType(AlgorithmType algorithmType)
{
_algorithmType = algorithmType;
} public override string ToString()
{
string result; switch (_algorithmType)
{
case AlgorithmType.MD5:
result = "Message-Digest Algorithm 5";
break;
case AlgorithmType.SHA1:
result = "Secure Hash Algorithm 1";
break;
case AlgorithmType.SHA224:
result = "Secure Hash Algorithm 224";
break;
case AlgorithmType.SHA256:
result = "Secure Hash Algorithm 256";
break;
case AlgorithmType.SHA384:
result = "Secure Hash Algorithm 384";
break;
case AlgorithmType.SHA512:
result = "Secure Hash Algorithm 512";
break;
default:
throw new Exception("哈希算法类型有误");
} return result;
} /// <summary>
/// 算法类型
/// </summary>
private enum AlgorithmType
{
/// <summary>
/// MD5
/// </summary>
MD5, /// <summary>
/// SHA1
/// </summary>
SHA1, /// <summary>
/// SHA224
/// </summary>
SHA224, /// <summary>
/// SHA256
/// </summary>
SHA256, /// <summary>
/// SHA384
/// </summary>
SHA384, /// <summary>
/// SHA512
/// </summary>
SHA512
}
}
在 HashAlgorithmType 类中,新建了一个私有的 AlgorithmType 枚举,这样就只允许 HashAlgorithmType 类访问,而不会在该类的外部(其它类型)进行访问。
正所谓萝卜青菜,各有所爱,假如你过于关于效率性能,或者说不需要使用诸如 [Description] 附加的特性,也不想额外的增添更多的行为和特征时,我们依然可以采用最原始的、大众化的版本。
通过重写 class 的 ToString() 来简化获取 enum 的 DescriptionAttribute 值的更多相关文章
- .Net反射-两种方式获取Enum中的值
public enum EJobType { 客服 = , 业务员 = , 财务 = , 经理 = } Type jobType = typeof(EJobType); 方式1: Array enum ...
- C# 获取Enum 描述和值集合
//获取枚举的值 public static IEnumerable<T> GetEnumValues<T>() where T : struct { T[] values = ...
- request对象常用API 获取请求参数的值 request应用 MVC设计模式
1 request对象常用API 1)表示web浏览器向web服务端的请求 2)url表示访问web应用的完整路径:http://localhost:8080/day06/Demo1 ...
- 安卓Android控件ListView获取item中EditText值
可以明确,现在没有直接方法可以获得ListView中每一行EditText的值. 解决方案:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值. 大概算法:重写Ba ...
- Android控件ListView获取item中EditText值
能够明白,如今没有直接方法能够获得ListView中每一行EditText的值. 解决方式:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值. 大概算法:重写Ba ...
- 获取程序的SHA1值
android获取程序的SHA1值 public static String getSHA1(Context context) { try { PackageInfo info = context.g ...
- 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)
1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...
- Entity Framwork(EF) 7——在Controller内获取指定字段的值
一.开发背景: 在用户登录的时候,验证用户和密码是否正确.验证通过后将用户名和用户ID保存下来以便后续数据更新时使用. 二.用户验证方法: 1.创建DBContext 对象. ApplicationD ...
- jquery attr()方法 添加,修改,获取对象的属性值。
jquery attr()方法 添加,修改,获取对象的属性值. jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到 ...
随机推荐
- 2017年最新基于Bootstrap 4 的专业、多用途响应式布局的系统模板
本文分享一款2017年最新的2017年最新基于Bootstrap 4 的专业.多用途响应式布局的系统模板,该模板是一款强大并且非常灵活的后台管理系统模板:能适应绝大多数的web应用程序开发,比如:AP ...
- AC自动机讲解
今天花了半天肝下AC自动机,总算啃下一块硬骨头,熬夜把博客赶出来.. 正如许多博客所说,AC自动机看似很难很妙,而事实上不难,但的确很妙.笼统地说,AC自动机=Trie+KMP,但是仅仅知道这个并没有 ...
- BZOJ 1061: [Noi2008]志愿者招募【单纯形裸题】
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4813 Solved: 2877[Submit][Stat ...
- Let the Balloon Rise(水)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1004 Let the Balloon Rise Time Limit: 2000/1000 MS (J ...
- android文件选择器、仿淘宝编辑页面、新手引导层等源码
Android精选源码 单片机和安卓应用,传感器 文件选择器 android滑动选择的尺子view源码 android视频录制 视频压缩的源码 仿今日头条顶部导航指示器源码 Android框架+常用控 ...
- c++(循环单向链表)
前面的博客中,我们曾经有一篇专门讲到单向链表的内容.那么今天讨论的链表和上次讨论的链表有什么不同呢?重点就在这个"循环"上面.有了循环,意味着我们可以从任何一个链表节点开始工作,可 ...
- 将简单的lambda表达式树转为对应的sqlwhere条件
1.Lambda的介绍 园中已经有很多关于lambda的介绍了.简单来讲就是vs编译器给我带来的语法糖,本质来讲还是匿名函数.在开发中,lambda给我们带来了很多的简便.关于lambda的演变过程可 ...
- Winform & Devexpress Chart使用入门
一.Chart(Winform) 使用图表控件(chart)首先要理解图表区域(ChartArea).XY轴(AxisX.AxisY).数据点(Series).标题(Title).图例(Legend) ...
- linux 下CentOS 下 npm命令安装gitbook失败的问题
运行环境 linux 服务器:CentOS 7.0 系统:安装了nodejs :使用 npm 安装 gitbook 出现错误提示: npm install -g gitbook-cli symbol ...
- 关于vueThink框架打包发布的一些问题
刚开始发布自己的vueThink项目的时候,总是出现404错误,后来经过上网查找,发现是路径的问题,这方面的知识,网上很多,就不过多阐述了.我主要想说的是自己的项目发布的时候,admin账号登录的时候 ...