项目中,用到枚举值,并且增加中英文描述。

一般的[Description]属性,无法满足中英文,所以进行了简单扩展。

继承DescriptionAttribute,增加了英文描述descriptionEN

public class BaseDescriptionAttribute : DescriptionAttribute
{
public BaseDescriptionAttribute(string descriptionCN)
: base(descriptionCN)
{
}
public BaseDescriptionAttribute(string descriptionCN, string descriptionEN)
: base(descriptionCN)
{
this.descriptionEN = descriptionEN;
} private string descriptionEN; public string DescriptionEN
{
get { return descriptionEN; }
set { descriptionEN = value; }
} }

增加一个操作类:public static class EnumOperate

GetBaseDescription:操作BaseDescriptionAttribute

GetDescription:操作DescriptionAttribute

EnumToDictionary:获取枚举值的key和value

GetEnumItems:获取枚举的相关信息(key,value,中文描述,英文描述)

public static class EnumOperate
{ /// <summary>
/// 扩展方法,获得枚举的Description
/// </summary>
/// <param name="value">枚举值</param>
/// <param name="nameInstead">当枚举值没有定义DescriptionAttribute,是否使用枚举名代替,默认是使用</param>
/// <returns>枚举的Description</returns>
public static EnumItem GetBaseDescription(this Enum value, Boolean nameInstead = true)
{
EnumItem e = new EnumItem(); Type type = value.GetType();
string name = Enum.GetName(type, value);
if (name == null)
{
return null;
} FieldInfo field = type.GetField(name);
BaseDescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(BaseDescriptionAttribute)) as BaseDescriptionAttribute; if (attribute == null && nameInstead == true)
{
e.DescriptionCN = name;
e.DescriptionEN = name;
return e;
}
else
{
e.DescriptionCN = attribute.Description;
e.DescriptionEN = attribute.DescriptionEN;
return e;
} } /// <summary>
/// 扩展方法,获得枚举的Description
/// </summary>
/// <param name="value">枚举值</param>
/// <param name="nameInstead">当枚举值没有定义DescriptionAttribute,是否使用枚举名代替,默认是使用</param>
/// <returns>枚举的Description</returns>
public static string GetDescription(this Enum value, Boolean nameInstead = true)
{
Type type = value.GetType();
string name = Enum.GetName(type, value);
if (name == null)
{
return null;
} FieldInfo field = type.GetField(name);
DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; if (attribute == null && nameInstead == true)
{
return name;
}
return attribute == null ? null : attribute.Description;
} /// <summary>
/// 把枚举转换为键值对集合
/// 枚举转换为键值对集合
/// Dictionary<Int32, String> dic = EnumUtil.EnumToDictionary(typeof(Season), e => e.GetDescription());
/// </summary>
/// <param name="enumType">枚举类型</param>
/// <param name="getText">获得值得文本</param>
/// <returns>以枚举值为key,枚举文本为value的键值对集合</returns>
public static Dictionary<Int32, String> EnumToDictionary(Type enumType, Func<Enum, String> getText)
{
if (!enumType.IsEnum)
{
throw new ArgumentException("传入的参数必须是枚举类型!", "enumType");
}
Dictionary<Int32, String> enumDic = new Dictionary<int, string>();
Array enumValues = Enum.GetValues(enumType);
foreach (Enum enumValue in enumValues)
{
Int32 key = Convert.ToInt32(enumValue);
String value = getText(enumValue);
enumDic.Add(key, value);
}
return enumDic;
} /// <summary>
/// 获取枚举的相关信息
/// </summary>
/// <param name="e">枚举的类型</param>
/// <returns></returns>
public static List<EnumItem> GetEnumItems(Type e)
{
List<EnumItem> itemList = new List<EnumItem>();
foreach (Enum v in Enum.GetValues(e))
{
EnumItem item = new EnumItem();
// TODO: 遍历操作
item.EnumKey = Convert.ToInt32(v);
item.EnumValue = v.ToString();
item.DescriptionCN = GetBaseDescription(v).DescriptionCN;
item.DescriptionEN = GetBaseDescription(v).DescriptionEN;
itemList.Add(item);
}
return itemList; } public class EnumItem
{
public int EnumKey { get; set; }
public string EnumValue { get; set; }
public string DescriptionCN { get; set; }
public string DescriptionEN { get; set; }
}
}

一些基本方法,参考了 http://www.cnblogs.com/lyl6796910/p/3958768.html

实际运用:

获取某个枚举类的全部信息

static void Main(string[] args)
        {
            var q = EnumOperate.GetEnumItems(typeof(WMS_Invoicing));             Console.ReadLine();         } public enum WMS_Invoicing
        {
            //入库
            [TestApp.Program.BaseDescription("In","InEn")]
            Input = 1,             //出库
            [TestApp.Program.BaseDescription("Out", "OutEn")]
            Output = 2,             //修正
            [TestApp.Program.BaseDescription("Corrected", "123")]
            Corrected = 3,             //损耗
            [TestApp.Program.BaseDescription("Loss", "haha")]
            Loss = 4,         }

Enum 扩展的更多相关文章

  1. Enum扩展及MVC中DropDownListFor扩展方法的使用

    public enum SearchState { /// <summary> /// 全部 /// </summary> [Description("全部" ...

  2. Enum扩展特性,代替中文属性

    由于对英语的天生缺陷,在枚举时一直使用中文,这样就不用看注释就知道枚举意思,今天看到博文 https://www.cnblogs.com/emrys5/p/Enum-rename-htmlhelper ...

  3. Swift Enum 枚举

    前言 枚举是一种自定义的数据类型,在 Swift 中枚举类型拥有相当高的自由度.在 Swift 语言中枚举是一级类型,它拥有在其他语言中只有类才拥有的一些特性,比如实例方法,实例构造器等. 枚举声明的 ...

  4. [置顶] .NET下枚举类型的Save和Load分析

    今天在写代码的时候,心血来潮对原来的字符串保存状态位的方式很不满意,对于代码里出现了 state == "1" 这样的状态判断很是不爽.那么理想中的判断是怎样的呢?很简单如你所想枚 ...

  5. MySQL优化小建议

    背景 "那啥,你过来一下!" "怎么了?我代码都单元测试了的,没出问题啊!"我一脸懵逼跑到运维大佬旁边. "你看看!你看看!多少条报警,赶快优化一下! ...

  6. MYSQL数据库的设计与调优

    优化思路: 1.检查数据表结构,改善不完善设计 2.跑一遍主要业务,收集常用的数据库查询SQL 3.分析查询SQL,适当拆分,添加索引等优化查询 4.优化SQL的同时,优化代码逻辑 5.添加本地缓存和 ...

  7. 四、Attribute

    Attribute分两种 Attribute称为特性,语法:特性(Attribute)的名称和值是在方括号内规定的,放置在它所应用的元素之前. 1.ActionFilterAttribute(过滤器) ...

  8. MySQL数据库优化小建议

    背景 “那啥,你过来一下!” “怎么了?我代码都单元测试了的,没出问题啊!”我一脸懵逼跑到运维大佬旁边. “你看看!你看看!多少条报警,赶快优化一下!”运维大佬短信列表里面好多MySQL CPU 10 ...

  9. Java核心编程快速入门

    Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示. 反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的 ...

随机推荐

  1. java语言基础1问题汇总

    1.一个Java类文件中真的只能有一个公有类吗? 程序实验: public class test1 { public static void main( String args[] ){ } publ ...

  2. LeetCode202:Happy Number 。C#版,在vs2010中通过,leetcode中Wrong Answer

    static List<int> nums = new List<int>(); public static bool IsHappy(int n) { int newint ...

  3. IIR数字滤波器的实现(C语言)

    经典滤波器和数字滤波器 一般滤波器可以分为经典滤波器和数字滤波器. 经典滤波器:假定输入信号中的有用成分和希望去除的成分各自占有不同的频带.如果信号和噪声的频谱相互重迭,经典滤波器无能为力.比如 FI ...

  4. (转) Ubuntu 更改文件夹及子文件夹权限

    Linux系统下如何修改文档及文件夹(含子文件夹)权限,我们来看一下. 一 介绍: 可以使用命令chmod来为文件或目录赋予权限.Linux/Unix 的档案存取权限分为三级 : 档案拥有者.群组.其 ...

  5. Ionic下的JPush缺少统计代码问题解决方法

    用Ionic打包apk后安装到手机,收到缺少统计代码的提示,解决方法如下: 1. 找到了 platforms/android/src/com/ionichina/ioniclub/MainActiov ...

  6. [UWP 自定义控件]了解模板化控件(6):使用附加属性

    1. 基本需求 之前的ContentView2添加了PointerOver等效果,和TextBox等本来就有Header的控件放在一起反而变得鹤立鸡群. 为了解决这个问题,这次把ContentView ...

  7. React Native 教程:001 - 如何运行官方控件示例 App

    原文发表于我的技术博客 本文主要讲解了如何运行 React Native 官方控件示例 App,包含了一些 React Native 的基础知识以及相关环境的配置. 原文发表于我的技术博客 React ...

  8. youtube下载工具

    Youtube是一个全球性的视频分享网站,其种类之多,内容之丰富,是大家有目共睹的.特别是原创视频更是多不胜数, 每分钟都有400+小时的youtube视频上传,每天都有30亿+的视频被观看.随着视频 ...

  9. Mysqldump备份说明及数据库备份脚本分享-运维笔记

    MySQLdump是MySQL自带的导出数据工具,即mysql数据库中备份工具,用于将MySQL服务器中的数据库以标准的sql语言的方式导出,并保存到文件中.Mysqldump是一个客户端逻辑备份的工 ...

  10. LVS负载均衡-基础知识梳理

    一. 集群的概念 服务器集群简称集群是一种服务器系统,它通过一组松散集成的服务器软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台服务器.集群系统中的单个服务器通常称 ...