C#枚举扩展方法,获取枚举值的描述值以及获取一个枚举类下面所有的元素

/// <summary>
    /// 枚举扩展方法
    /// </summary>
    public static class EnumExtension
    {
        private static Dictionary<string, Dictionary<string, string>> _enumCache;

        /// <summary>
        /// 缓存
        /// </summary>
        private static Dictionary<string, Dictionary<string, string>> EnumCache
        {
            get { return _enumCache ?? (_enumCache = new Dictionary<string, Dictionary<string, string>>()); }
            set { _enumCache = value; }
        }

        /// <summary>
        /// 获取枚举描述信息
        /// </summary>
        /// <param name="en"></param>
        /// <returns></returns>
        public static string GetEnumText(this System.Enum en)
        {
            string enString = string.Empty;
            if (null == en) return enString;

            Type type = en.GetType();
            enString = en.ToString();
            if (!EnumCache.ContainsKey(type.FullName))
            {
                System.Reflection.FieldInfo[] fields = type.GetFields();
                Dictionary<string, string> temp = new Dictionary<string, string>();
                foreach (FieldInfo item in fields)
                {
                    object[] attrs = item.GetCustomAttributes(typeof(TextAttribute), false);
                    if (attrs.Length == 1)
                    {
                        string v = ((TextAttribute)attrs[0]).Value;
                        temp.Add(item.Name, v);
                    }
                }
                EnumCache.Add(type.FullName, temp);
            }
            if (EnumCache[type.FullName].ContainsKey(enString))
            {
                return EnumCache[type.FullName][enString];
            }
            return enString;
        }

        /// <summary>
        /// 遍历枚举对象的所有元素
        /// </summary>
        /// <typeparam name="T">枚举对象</typeparam>
        /// <returns>Dictionary:枚举值-描述</returns>
        public static Dictionary<int, string> GetEnumValues<T>()
        {
            Dictionary<int, string> dictionary = new Dictionary<int, string>();
            foreach (var code in System.Enum.GetValues(typeof(T)))
            {
                ////获取名称
                //string strName = System.Enum.GetName(typeof(T), code);

                object[] objAttrs = code.GetType().GetField(code.ToString()).GetCustomAttributes(typeof(TextAttribute), true);
                if (objAttrs.Length > 0)
                {
                    TextAttribute descAttr = objAttrs[0] as TextAttribute;
                    if (!dictionary.ContainsKey((int)code))
                    {
                        if (descAttr != null) dictionary.Add((int)code, descAttr.Value);
                    }
                    //Console.WriteLine(string.Format("[{0}]", descAttr.Value));
                }
                //Console.WriteLine(string.Format("{0}={1}", code.ToString(), Convert.ToInt32(code)));
            }
            return dictionary;
        }

    }

    /// <summary>
    /// 自定义描述
    /// </summary>
    public class TextAttribute : Attribute
    {
        public TextAttribute(string value)
        {
            Value = value;
        }

        /// <summary>
        /// 描述信息
        /// </summary>
        public string Value { get; set; }
    }
时间: 2024-10-19 15:54:07

C#枚举扩展方法,获取枚举值的描述值以及获取一个枚举类下面所有的元素的相关文章

枚举扩展方法获取枚举Description

枚举扩展方法 1 /// <summary> 2 /// 扩展方法,获得枚举的Description 3 /// </summary> 4 /// <param name="value">枚举值</param> 5 /// <param name="nameInstend">当枚举没有定义DescriptionAttribute,是否用枚举名代替,默认使用</param> 6 /// <r

扩展方法用法及其原理和注意事项

前言 一直以来尤其像C#一些常见的语法,本人更愿意去探讨其内部实现的原理,为什么要这么做呢?只是为了当我真正在开发中运用语法的时候不会因为犯常识性错误或者说因为一些注意事项未曾注意到而耽误一些无谓的时间,同时也能理解的更深入而不是仅仅停留在表面(或许理解也不是太透).(当然本人能力有限,太高深的东西必定是研究不明白了,也只有这能力了). 概念 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例

枚举获得Description扩展方法

定义枚举类型: internal enum SexEnum { [Description("男性")] Man=1, [Description("女性")] Woman =2, [Description("未知")] Unknown =3, TestNoDescription=4 } 枚举扩展方法: /// <summary> /// 枚举<see cref="Enum" />的扩展辅助操作方法 ///

在C#中如何读取枚举值的描述属性

在C#中,有时候我们需要读取枚举值的描述属性,也就是说这个枚举值代表了什么意思.比如本文中枚举值 Chinese ,我们希望知道它代表意思的说明(即“中文”). 有下面的枚举: 1 2 3 4 5 6 public enum EnumLanugage {     [System.ComponentModel.Description("中文")]     Chinese,     English } 我们要获取的就是 Chinese 中的说明文字“中文”. 1 2 3 4 5 6 7 8

返回枚举值的描述 根据枚举类型返回类型中的所有值、文本及描述

/// <summary> /// 返回枚举值的描述 /// </summary> /// <param name="value">枚举值</param> /// <returns>指定枚举值描述</returns> public static string getEnumDescription(this Enum value) { FieldInfo fi = value.GetType().GetField(v

C#的扩展方法解析

在使用面向对象的语言进行项目开发的过程中,较多的会使用到"继承"的特性,但是并非所有的场景都适合使用"继承"特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继承关系实在编译时就定义好了,所以无法在运行时改变从父类继承的实现.子类的实现与它父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化.当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写它或被其他更适合的类替换,这种依赖关系限制

泛型集合的静态扩展方法

C# 中的泛型集合提供了很多基于 Enumerable 的静态扩展方法,例如  Find,  OrderBy , Average ,Distinct 等,在使用基础数据类型的集合时,可以直接调用这些方法,但如果是自定义类型就应当根据扩展方法所要求的接口,实现自定类型的扩展接口类,其实质就是使用扩展类的实例方法完成特定的操作逻辑,否则对集合的操作将是无效的.本文以 OrderBy 为例进行说明 . 首先需要一个自定义的类 ,这是一个表示自然人属性的简单类,列出了姓名.年龄和性别(这里使用了枚举类型

[C#详解] (1) 自动属性、初始化器、扩展方法

代码下载:点我下载 目录 前言 属性与自动属性 属性 自动属性 初始化器 对象初始化器 集合初始化器 扩展方法 无参数扩展方法 带参数扩展方法 结尾 前言 首先祝大家2015新年快乐! 新的一年,新的开始.来博客园安家已经快两个月了.每天看博客.写博客.评论.回答博问已经渐渐养成了一种习惯.可以很明显的感觉到泡在博客园里真的可以学到很多,不论是技术文章的还是一些记叙经历.抒发感想的随笔,都让我从各个方面受益良多.不知道大家是否和我一样,就是感觉博客园有一种特殊的魔力,让你没事就想上去看一眼,看上

[读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法

前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好处, 下一遍会单独介绍Lambda表达式. 这篇主要包括的内容有: 自动属性,隐式类型,对象集合初始化,匿名类型,扩展方法. 下面一起来看下C#3.0 所带来的变化吧. 1,自动实现的属性在C#3.0之前, 定义属性时一般会像下面这样去编写代码: 1 class Person 2 { 3 //定义私