.Net反射-两种方式获取Enum中的值
public enum EJobType
{
客服 = , 业务员 = , 财务 = , 经理 =
}
Type jobType = typeof(EJobType);
方式1:
Array enumItems = Enum.GetValues(jobType);
foreach (var enumItem in enumItems)
{
int value = (int)enumItem;
string text = enumItem.ToString();
}
方式2:
FieldInfo[] fields = jobType.GetFields(BindingFlags.Static | BindingFlags.Public);//
foreach (var field in fields)
{
string text = field.Name;
object value = field.GetRawConstantValue();
}
再分享一个Enum的扩展:
public static class EnumExtensions
{
/// <summary>
/// 枚举信息
/// </summary>
public class EnumInfo<T>
{
/// <summary>
/// 枚举名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 显示的名称
/// </summary>
public string DisplayName { get; set; }
/// <summary>
/// 值
/// </summary>
public T Value { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
} /// <summary>
/// 获取枚举值的名称
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string GetName(this Enum value)
{
return Enum.GetName(value.GetType(), value);
}
/// <summary>
/// 获取该枚举的显示值(如果使用了DisplayAttribute 标签则显示描述中的别名,否则使用 Enum 的名称。)
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string GetText(this Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
if (fi == null)
{
return string.Empty;
} DisplayAttribute[] attributes = (DisplayAttribute[])fi.GetCustomAttributes(typeof(DisplayAttribute), false);
if ((attributes != null) && (attributes.Length > ))
return attributes[].Name;
else
return value.ToString();
} /// <summary>
/// 获取枚举代表的值
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static int GetValue(this Enum value)
{
return Convert.ToInt32(value);
}
public static T Parse<T>(this Enum enumThis, int value)
{
return (T)Enum.Parse(enumThis.GetType(), value.ToString());
}
public static T Parse<T>(this Enum enumThis, string value)
{
return (T)Enum.Parse(enumThis.GetType(), value);
}
/// <summary>
/// 根据Name获取Value
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static int GetEnumValue(Type enumType, string enumName)
{
return (int)Enum.Parse(enumType, enumName);
}
/// <summary>
/// 获取枚举信息(名称,值,描述)
/// </summary>
/// <returns></returns>
public static List<EnumInfo<T>> GetEnumInfo<T>(this Type enumType)
{
if (!enumType.IsEnum) throw new InvalidOperationException("type not a enum!");
List<EnumInfo<T>> emInfos = new List<EnumInfo<T>>();
var fields = enumType.GetFields(BindingFlags.Static | BindingFlags.Public);
foreach (var fi in fields)
{
EnumInfo<T> emInfo = new EnumInfo<T>();
emInfo.Name = fi.Name;
emInfo.Value = (T)fi.GetRawConstantValue();
var displayAttr = fi.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault();
if (displayAttr != null)
{
emInfo.DisplayName = ((DisplayAttribute)displayAttr).Name;
emInfo.Description = ((DisplayAttribute)displayAttr).Description;
}
var desAttr = fi.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault();
if (desAttr != null)
{
emInfo.Description = ((DescriptionAttribute)desAttr).Description;
}
if (string.IsNullOrWhiteSpace(emInfo.Description))
{
emInfo.Description = fi.Name;
}
if (string.IsNullOrWhiteSpace(emInfo.DisplayName))
{
emInfo.DisplayName = fi.Name;
}
emInfos.Add(emInfo);
}
return emInfos;
}
public static List<EnumInfo<object>> GetEnumInfo(this Type enumType)
{
return GetEnumInfo<object>(enumType);
}
}
.Net反射-两种方式获取Enum中的值的更多相关文章
- Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)
反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...
- 总结javascript继承的两种方式的N中写法
最近翻看博客园,总结了一下javascript的继承方式:prototype和copy继承方式. 一.prototype方式 当一个函数被创建时,Function构造函数产生的函数会隐式的被赋予一个p ...
- android两种方式获取AsyncTask返回值
获取AsyncTask返回值,在Activity中使用. 引用链接:https://www.oschina.net/code/snippet_725438_49858#72630 [1].[代码] [ ...
- android手机两种方式获取IP地址
1.使用WIFI 首先设置用户权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"& ...
- Java中HashMap遍历的两种方式
Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...
- spark-streaming-连接kafka的两种方式
推荐系统的在线部分往往使用spark-streaming实现,这是一个很重要的环节. 在线流程的实时数据一般是从kafka获取消息到spark streaming spark连接kafka两种方式在面 ...
- MarkDown技巧:两种方式实现页内跳转
MarkDown技巧:两种方式实现页内跳转 本人邮箱:JohnTsai.Work@gmail.com,欢迎交流讨论. 欢迎转载,转载请注明网址:http://www.cnblogs.com/JohnT ...
- 浅析使用vue-router实现前端路由的两种方式
关于vue-router 由于最近的项目中一直在使用vue,所以前端路由方案也是使用的官方路由vue-router,之前在angularJS项目中也是用过UI-router,感觉大同小异,不过很显然v ...
- Java反射获取class对象的三种方式,反射创建对象的两种方式
Java反射获取class对象的三种方式,反射创建对象的两种方式 1.获取Class对象 在 Java API 中,提供了获取 Class 类对象的三种方法: 第一种,使用 Class.forName ...
随机推荐
- pyqt5环境变量踩坑记
之前用一个cmd脚本 wmic ENVIRONMENT create name="QT_QPA_PLATFORM_PLUGIN_PATH",username="<s ...
- python数据分析教程大全
第一篇:Anaconda安装和使用 第二篇:Jupyter norebook使用 第三篇:pandas教程 第四篇:numpy教程 第五篇:Matplotlib教程 第六篇:实战项目 期待吗?(微笑脸 ...
- Paper | Squeeze-and-Excitation Networks
目录 1. 故事 2. SENet 2.1 概况 2.2 具体 3. 实验 本文的贡献点在于:通过显式建模特征注意力机制,达到了很好的效果.这是以往被默认隐式学习的操作.并且注意,此时建模出来的注意力 ...
- 修改kile工程名字(转)
假设原来的工程文件名是first,要改成second1.在工程文件目录中,将first.uvopt和first.uvproj名字改成second.uvopt和second.uvproj.2.其他fir ...
- Azure CosmosDB (14) 使用Postman访问CosmosDB REST API
<Windows Azure Platform 系列文章目录> 今天研究了一下如何使用Postman访问Azure CosmosDB. CosmosDB API接口,可以参考:https: ...
- Python连载36-线程数量限制、Timer、可重入锁
一.允许一个资源最多由几个线程同时进行 命令行:threading.Semaphore(个数) 代表现在最多有几个线程可以进行操作 import threading import time #参数定义 ...
- HTML+CSS基础 权重的计算 权重计算规则
权重的计算 将选择器上面的选择器进行叠加,叠加后的总和就是该选择器的权重. 权重计算规则
- ts缓存批量下载合并
批量下载 curl -O https://cdn-host.media.yunxi.tv/recordM3u8/195820b37cec499da7a4b1b28269c7d0/tranbox/195 ...
- AngleSharp 实战(05)之遍历内部子元素(x)元素,尝试着获取元素的 Attr 和 InnerText
直接贴代码了: using System; using System.Linq; using System.Threading.Tasks; using AngleSharp; using Angle ...
- Linux用户和权限——管理用户和用户组的命令
Linux用户和权限——管理用户和用户组的命令 摘要:本文主要学习了在Linux系统中管理用户和用户组的命令. useradd命令 useradd命令可以用来创建新用户. 基本语法 useradd [ ...