枚举类型是定义了一组“符号名称/值”配对。枚举类型是强类型的。每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueType又从system.Object派生,所以枚举类型是指类型。

编译枚举类型时,C#编译器会把每个符号转换成类型的一个常量字段。C#编译器将枚举类型视为基元类型。

1.获取枚举列表:

        /// <summary>
/// 获取枚举列表
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <returns>枚举列表</returns>
public static Dictionary<int, string> GetEnumList(Type enumType)
{
var dic = new Dictionary<int, string>();
try
{
var fd = enumType.GetFields();
for (var index = ; index < fd.Length; ++index)
{
var info = fd[index];
var fieldValue = System.Enum.Parse(enumType, fd[index].Name);
var attrs = info.GetCustomAttributes(typeof(EnumTextAttribute), false);
foreach (EnumTextAttribute attr in attrs)
{
var key = (int)fieldValue;
if (key == -) continue;
var value = attr.Text;
dic.Add(key, value);
}
}
return dic;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

2.获取枚举名称:

        /// <summary>
/// 获取枚举名称
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="id">枚举值</param>
/// <returns>如果枚举值存在,返回对应的枚举名称,否则,返回空字符</returns>
public static string GetEnumTextById(Type enumType, int id)
{
var ret = string.Empty;
try
{
var dic = GetEnumList(enumType);
foreach (var item in dic)
{
if (item.Key != id) continue;
ret = item.Value;
break;
}
return ret;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

3.根据枚举值获取对应中文描述:

        /// <summary>
/// 根据枚举值获取对应中文描述
/// </summary>
/// <param name="enumValue">枚举值</param>
/// <returns>枚举值中文描述</returns>
public static string GetEnumTextByEnum(object enumValue)
{
var ret = string.Empty;
if ((int)enumValue == -) return ret;
try
{
var dic = GetEnumList(enumValue.GetType());
foreach (var item in dic)
{
if (item.Key != (int)enumValue) continue;
ret = item.Value;
break;
}
return ret;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

4.获取枚举名称:

        /// <summary>
/// 获取枚举名称
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="index">枚举值的位置编号</param>
/// <returns>如果枚举值存在,返回对应的枚举名称,否则,返回空字符</returns>
public static string GetEnumTextByIndex(Type enumType, int index)
{
var ret = string.Empty;
var dic = GetEnumList(enumType);
if (index < || index > dic.Count)
return ret;
var i = ;
foreach (var item in dic)
{
if (i == index)
{
ret = item.Value;
break;
}
i++;
} return ret;
}

5.获取枚举值:

        /// <summary>
/// 获取枚举值
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="name">枚举名称</param>
/// <returns>如果枚举名称存在,返回对应的枚举值,否则,返回-1</returns>
public static int GetEnumIdByName(Type enumType, string name)
{
var ret = -;
if (string.IsNullOrEmpty(name))
return ret;
var dic = GetEnumList(enumType);
foreach (var item in dic)
{
if (string.Compare(item.Value, name, StringComparison.Ordinal) != ) continue;
ret = item.Key;
break;
}
return ret;
}

6.获取名字对应枚举值:

        /// <summary>
/// 获取名字对应枚举值
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <param name="name">枚举名称</param>
/// <returns></returns>
public static T GetEnumIdByName<T>(string name) where T : new()
{
var type = typeof(T); var enumItem = (T)TypeDescriptor.GetConverter(type).ConvertFrom("-1");
if (string.IsNullOrEmpty(name))
return enumItem; try
{
var fd = typeof(T).GetFields();
for (var index = ; index < fd.Length; ++index)
{
var info = fd[index];
var fieldValue = System.Enum.Parse(type, fd[index].Name);
var attrs = info.GetCustomAttributes(typeof(EnumTextAttribute), false);
if (attrs.Length != ) continue;
var attr = (EnumTextAttribute)attrs[];
if (!name.Equals(attr.Text)) continue;
enumItem = (T)fieldValue;
break;
}
return enumItem;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

7.获取枚举值所在的位置编号:

        /// <summary>
/// 获取枚举值所在的位置编号
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="name">枚举名称</param>
/// <returns>如果枚举名称存在,返回对应的枚举值的位置编号,否则,返回-1</returns>
public static int GetEnumIndexByName(Type enumType, string name)
{
var ret = -; if (string.IsNullOrEmpty(name))
return ret; var dic = GetEnumList(enumType);
var i = ;
foreach (var item in dic)
{
if (string.Compare(item.Value, name, StringComparison.Ordinal) == )
{
ret = i;
break;
}
i++;
} return ret;
}

C#枚举类型的常用操作总结的更多相关文章

  1. 自定义枚举类型的常用操作-附源码(xjl456852原创)

    自定义枚举类型中,假如我们有name和desc这样的属性,并在这个基础上定义了多个对象. 那么就可能用到通过name获取desc,或者通过desc获取name.通过name或者desc获取对应的枚举对 ...

  2. Python元组类型、字典类型及常用操作

    一.元组类型 1.用途 记录多个值,当多个值没有改的需求,此时用元组更合适,Python的元组与列表类似,不同之处在于元组的元素不能修改. 2.定义方式 在()内用逗号分隔开多个任意类型的值 t=(1 ...

  3. Python列表类型及常用操作

    Python列表类型 1.用途: 存放多个值,可以根据索引存取值 2.定义方式: 在[ ]内用逗号分割开多个任意类型的值 l=['yven','law','lyf'] #l=list(['yven', ...

  4. C#基础(六)--枚举的一些常用操作

    本章将介绍以下几点: 1.如何把其它类型转换为枚举类型? 2.如何把枚举中的值添加到下拉菜单中? 一.如何把其它类型转换为枚举类型?        我们回顾一下有关字符串与数字之间的转换,如:     ...

  5. JavaScript类型相关常用操作

    JS数组,字符串,json互相转换 JS数组转字符串 使用数组自带的join方法可以把数组转化为字符串: let arr = [1,2,'uu']; let str = arr.join(','); ...

  6. mysql8.0 新特性,对json类型的常用操作

    mysql8 新特性-json数据类型操作 -- 根据key(可多个)获取value SELECT JSON_EXTRACT('{"id": 14, "name" ...

  7. JAVA-集合类型Set常用操作例子(基础必备)

    package com.net.xinfang.reflect; import java.util.Comparator; import java.util.HashSet; import java. ...

  8. Redis string类型常用操作

      Redis 有 string.list.set.zset.hash数据类型.string类型是最基础的,其他类型都是在string类型上去建立的,所以了解熟悉string类型的常用操作对于学习re ...

  9. 【转】掌握java枚举类型(enum type)

    原文网址:http://iaiai.iteye.com/blog/1843553 1   背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...

随机推荐

  1. sql rowversion

    RowsVersion就是timestamp   丢失更新的解决方法      丢失更新概念:当用户同时修改一行数据,他们先读取数据,放在前端进行修改,当修改后,再提交数据,这样最后提交的数据会覆盖先 ...

  2. 使用--gc-section编译选项减小程序体积

    本周在给程序添加功能的时候,突然发现,我只是写了几个函数,还没调用,size就变大了.这肯定是不行的嘛,没用的函数就应该不链接进来,占用我宝贵的空间. 这种功能,讲道理编译器肯定要支持的,于是搜了一下 ...

  3. dos清除缓存

    ipconfig /flushdns ,DNS缓存就被清除了. ipconfig /displaydns查看DNS缓存

  4. java身份证验证

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  5. DPC和ISR的理解

    首先来说中断 计算机的中断分为软中断和硬中断,即IRQL和DIRQL,共32个级别,从0~31级别依次提升,0~2属于软中断 一般线程运行于PASSIVE_LEVEL级别,如果不想在运行时切换到其他线 ...

  6. Visual Studio LightSwitch

    LightSwitch是一个基于模板的自动化开发Silverlight和HTML5应用程序的工具,不同于一般的基于数据字典,配置生成的应用程序的工具,因为LightSwtich提供的所有模板都是可以扩 ...

  7. 编译可在Android上运行的qemu user mode

    前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的”NDK”若无特殊说明均指”Android NDK”. 下文中”$NDK ...

  8. 【译】PHP的变量实现(给PHP开发者的PHP源码-第三部分)

    文章来自:http://www.aintnot.com/2016/02/12/phps-source-code-for-php-developers-part3-variables-ch 原文:htt ...

  9. C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  10. [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM

    一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...