zoukankan      html  css  js  c++  java
  • C# 枚举转列表

    C# 枚举列表

    独立观察员 2020 年 9 月 1 日

    今天有朋友问我,ComboBox 怎么绑定一个 Enum,其实他的意思是枚举如何转换为列表。想想这确实是一个挺正常的需求,但我一时也只想到遍历,他觉得麻烦,于是我在网上帮忙查了一下,提取了三个方法,后来在常用代码工具库也看到一个方法,所以总共四个方法,分为两组,功能可以说都是一样的,就是形式不同,现在分享给大家。

    #region 获取枚举列表
    
    /// <summary>
    /// 通过枚举对象获取枚举列表
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    public static List<T> GetEnumList<T>(this T value)
    {
        var list = new List<T>();
        if (value is Enum)
        {
            var valData =Convert.ToInt32((T)Enum.Parse(typeof(T), value.ToString())) ;
            var tps =Enum.GetValues(typeof (T));
    
            list.AddRange(from object tp in tps where ((int)Convert.ToInt32((T)Enum.Parse(typeof(T), tp.ToString())) & valData) == valData select (T) tp);
        }
    
        return list;
    }
    
    /* 以下 参考:https://www.codenong.com/17123548/ */
    
    /// <summary>
    /// 通过枚举类型获取枚举列表;
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    public static List<T> GetEnumList<T>() where T : Enum
    {
        List<T> list = Enum.GetValues(typeof(T)).OfType<T>().ToList();
        return list;
    }
    
    /* 以下 参考:https://www.codenong.com/105372/ */
    
    /// <summary>
    /// Gets all items for an enum value.(通过枚举对象获取所有枚举)
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    public static IEnumerable<T> GetAllItems<T>(this Enum value)
    {
        foreach (object item in Enum.GetValues(typeof(T)))
        {
            yield return (T)item;
        }
    }
    
    /// <summary>
    /// Gets all items for an enum type.(通过枚举类型获取所有枚举)
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static IEnumerable<T> GetAllItems<T>() where T : struct
    {
        foreach (object item in Enum.GetValues(typeof(T)))
        {
            yield return (T)item;
        }
    }
    
    #endregion

    按返回值类型,可以是 1 和 2 为一组,3 和 4 为一组;按方法性质,也可以将 1 和 3 为一组,2 和 4 为一组。

    1 和 2 都是返回 List ,3 和 4 都是返回可枚举集合 IEnumerable,这个也很方便进行遍历或者转为 List 。

    1 和 3 都是扩展方法,可以方便地通过枚举对象来获取相应的枚举类型的所有枚举,只不过从业务上看,这样调用的意图不够明确;而 2 和 4 则都是普通静态方法,通过静态类调用,也是比较简洁,且意图明确。

    下面,我们分别在每个方法体内右键 — 创建单元测试:

    最终单元测试代码如下:

    [TestClass()]
    public class EnumExtensionTests
    {
        /// <summary>
        /// 枚举类型
        /// </summary>
        enum ELanguage
        {
            CSharp = 0,
            Java = 1,
            VB = 2
        }
    
        /// <summary>
        /// 枚举对象
        /// </summary>
        private ELanguage _eLanguage = ELanguage.CSharp;
    
        [TestMethod()]
        public void GetEnumListTest1()
        {
            List<ELanguage> list = _eLanguage.GetEnumList(); //通过枚举对象获取枚举列表;
            Assert.IsTrue(list.Count > 0);
        }
    
        [TestMethod()]
        public void GetEnumListTest()
        {
            List<ELanguage> list = EnumExtension.GetEnumList<ELanguage>(); //通过枚举类型获取枚举列表;
            Assert.IsTrue(list.Count > 0);
        }
    
        [TestMethod()]
        public void GetAllItemsTest()
        {
            var allItems = _eLanguage.GetAllItems<ELanguage>(); //通过枚举对象获取所有枚举;
            List<ELanguage> list = allItems.ToList();
            Assert.IsTrue(list.Count > 0);
        }
    
        [TestMethod()]
        public void GetAllItemsTest1()
        {
            var allItems = EnumExtension.GetAllItems<ELanguage>(); //通过枚举类型获取所有枚举;
            List <ELanguage> list = allItems.ToList();
            Assert.IsTrue(list.Count > 0);
        }
    }

    测试结果都是通过的:

    最后给出代码地址:https://gitee.com/dlgcy/dotnetcodes/tree/dlgcy/DotNet.Utilities/ 枚举 

    同步首发:

    http://dlgcy.com/csharp-enum-to-list/

    微信公众号

  • 相关阅读:
    vue—子调父 $emit (把子组件的数据传给父组件)
    解决 Error: EBUSY: resource busy or locked, rmdir 'E:/...'问题
    php中session原理及安全性问题
    MySQL函数大全及用法示例
    php基础语法
    常用sql语句
    php表单传值--GET和POST
    jQuery插件的使用方法
    $.ajax()方法详解
    php文件上传
  • 原文地址:https://www.cnblogs.com/weiliuhong/p/csharp-enum-to-list.html
Copyright © 2011-2022 走看看