C# 枚举类型 enum
我个人感觉平日用到的enum应该是非常简单的,无非就是枚举和整数、字符串之间的转换。最近工作发现一些同事居然不太会用这个东东,于是就整理一下。
枚举类型是定义了一组“符号名称/值”配对。枚举类型是强类型的。每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueType又从system.Object派生,所以枚举类型是值类型。编译枚举类型时,C#编译器会把每个符号转换成类型的一个常量字段。C#编译器将枚举类型视为基元类型。因为enum是值类型,而所有的值类型都是sealed,所以在扩展方法时都不能进行约束。但是,若要限制参数为值类型,可用struct 约束。因为enum一般用于一个字符串和整数值,如果我们需要关联多个字符串的时候可以使用Description特性,如果枚举彼此需要与或运算,需要借助Flags特性,enum里面定义的字符常量其整数值默认从0开始。
看一下枚举定义:
public enum AwardType
{
/// <summary>
///1 积分
/// </summary>
[Description("积分")]
Integral = , /// <summary>
/// 2 充值卡
/// </summary>
[Description("充值卡")]
RechargeCard = , /// <summary>
/// 3 实物奖品
/// </summary>
[Description("实物奖品")]
Gift = ,
}
public static class Extend
{
public static string Description<T>(this T instance) where T : struct
{
string str = string.Empty;
Type type = typeof(T);
if (!typeof(T).IsEnum)
{
throw new ArgumentException("参数必须是枚举类型");
}
var fieldInfo = type.GetField(instance.ToString());
if (fieldInfo != null)
{
var attr = fieldInfo.GetCustomAttribute(typeof(DescriptionAttribute), false) as DescriptionAttribute;
if (attr != null)
{
str = attr.Description;
}
else
{
str = fieldInfo.Name;
} }
return str;
} public static T GetEnum<T>(this string description)
{
var fieldInfos = typeof(T).GetFields();
foreach (FieldInfo field in fieldInfos)
{
DescriptionAttribute attr = field.GetCustomAttribute(typeof(DescriptionAttribute), false) as DescriptionAttribute;
if (attr != null && attr.Description == description)
{
return (T)field.GetValue(null);
}
else if (field.Name == description)
{
return (T)field.GetValue(null);
}
}
throw new ArgumentException(string.Format("{0} 未能找到对应的枚举.", description), "Description");
}
}
编译后如下:
在编码的时候 必要的注释 不能缺少,如下
/// <summary>
/// 3 实物奖品
/// </summary>
这样VS在只能感知的时候就可以看到了。
而枚举的应用也非常简单:
static void Main(string[] args)
{
//枚举与整数转换
int giftInt = (int)AwardType.Gift;
var a = (AwardType)giftInt;
//枚举与字符串转换
string giftStr = AwardType.Gift.ToString();
Enum.TryParse(giftStr, out AwardType b);
///检测枚举是否有效
bool isdefine = Enum.IsDefined(typeof(AwardType), );
////获取枚举描述
string str = AwardType.Gift.Description();
////通过描述获取枚举
AwardType award = str.GetEnum<AwardType>();
Console.ReadKey();
}
这里枚举和其描述信息是直接通过反射来实现的,为了性能提高可以采用字典缓存数据。
C# 枚举类型 enum的更多相关文章
- 【转】java枚举类型enum的使用
原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...
- C# 中的枚举类型 enum (属于值类型)
原文 C# 中的枚举类型 enum (属于值类型) C# 支持两种特殊的值类型:枚举和结构. 声明枚举:声明时要声明所有可能的值. using System; using System.Collect ...
- 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)
java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...
- 枚举类型enum详解——C语言
enum enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶 ...
- 深入理解Java枚举类型(enum)
https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...
- 人生苦短之Python枚举类型enum
枚举类型enum是比较重要的一个数据类型,它是一种数据类型而不是数据结构,我们通常将一组常用的常数声明成枚举类型方便后续的使用.当一个变量有几种可能的取值的时候,我们将它定义为枚举类型.在Python ...
- 全面解读Java中的枚举类型enum的使用
这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...
- Java基础之枚举类型Enum的使用
Java基础之枚举类型Enum的使用 定义 public enum AccruedCleanEnum { SPREAD("1","发票"),OTHER(&quo ...
- 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)
新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...
- Asp.Net 将枚举类型(enum)绑定到ListControl(DropDownList)控件
在开发过程中一些状态的表示使用到枚举类型,那么如何将枚举类型直接绑定到ListControl(DropDownList)是本次的主题,废话不多说了,直接代码: 首先看工具类代码: /// <su ...
随机推荐
- MySQL 命令总结
MySQL命令总结 1.数据库操作 查看在当前服务器中有多少个数据库 创建数据库 >CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLL ...
- gitlab之四: gitlab ssh key 配置
参考: https://www.cnblogs.com/hafiz/p/8146324.html 1. gitlab的右上角. 用户下拉菜单--->setting>ssh密钥,将公钥 ...
- Bootstrap 框架、插件
Bootstrap,前端工程师比较常用的框架.插件,根据它的定义,我们不妨这样理解,Bootstrap就是用于前端开发的一个模板,就是别人做好了我们直接可以搬过来直接使用或者根据自己需要略加修改设计自 ...
- 027 ResourceBundle.getBundle方法
在程序中遇到这个,感觉会比较重要,就学习一番. 一:静态读取配置文件的Demo 1.新建工程 2.新建properties 3.新建Java的demo程序 注意不要写properties. packa ...
- 深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)
赋值 python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间. a = 123b = a print(id(a) ...
- Service工作原理
--摘自<android插件化开发指南> 一.在新进程启动Service 第一步:APP向AMS发送一个启动Service的消息 通过AMN/AMP把要启动的Service信息发送给AMS ...
- 【python】常用第三方模块
No1: [Pillow]图像处理标准库 缩放 from PIL import Image # 打开一个jpg图像文件,注意是当前路径: im = Image.open('test.jpg') # 获 ...
- 【LeetCode算法-9】Palindrome Number
LeetCode第9题 Determine whether an integer is a palindrome. An integer is a palindrome when it reads t ...
- POJ 3264 Balanced Lineup 【线段树】
<题目链接> 题目大意: 求给定区间内最大值与最小值之差. 解题分析: 线段树水题,每个节点维护两个值,分别代表该区间的最大和最小值即可. #include <cstdio> ...
- poj 3685 Matrix 【二分】
<题目链接> 题目大意: 给你一个n*n的矩阵,这个矩阵中的每个点的数值由 i2 + 100000 × i + j2 - 100000 × j + i × j 这个公式计算得到,N( ...