C# 枚举 扩展方法

C# 枚举 扩展方法

功能

        1.获取枚举描述

        2.将指定枚举类型转换成List

        3.将枚举类型转换成ListModel

        4.绑定枚举

优点

        1.一定编写随处可用。

        2.调用代码简单,代码量少。

        3.成熟代码无BUG

我是封装到DLL文件中,在具体的项目中引用。

 调用

1、获取枚举列表 绑定到下列表中

//打标类型 下拉列表绑定数据
            comboBoxMarkType.Items.Clear();
            var markTypeEnumList = EnumExtension.GetEnumModelList(MarkTypeEnum.Array);
            comboBoxMarkType.DataSource = markTypeEnumList;
            comboBoxMarkType.DisplayMember = "Description";
            comboBoxMarkType.ValueMember = "Val";

如果用不了可能是没有引用命名空间。

2.获取枚举的描述属性值

var valInt = int.Parse(val.ToString());
                var markTypeEnumObj = (MarkTypeEnum)valInt;
                MessageBox.Show(markTypeEnumObj.GetEnumDesc());

效果

        

        

引用命令空间

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

代码

/// <summary>
/// 枚举 扩展方法
/// </summary>
public static class EnumExtension
{
    #region 属性定义
    private static ConcurrentDictionary<string, ConcurrentDictionary<string, string>> _enumDic = new ConcurrentDictionary<string, ConcurrentDictionary<string, string>>();
    private static readonly object objLock = new object();
    #endregion

    /// <summary>
    /// 获取枚举描述
    /// </summary>
    /// <param name="e">任意枚举类型</param>
    /// <returns>对应描述</returns>
    public static string GetEnumDesc(this Enum e)
    {
        var description = string.Empty;
        var fullName = e.GetType().FullName;
        ConcurrentDictionary<string, string> descriptionDic = null;
        if (_enumDic.TryGetValue(fullName, out descriptionDic))
        {
            descriptionDic.TryGetValue(e.ToString(), out description);
        }
        else
        {
            lock (objLock)
            {
                descriptionDic = new ConcurrentDictionary<string, string>();
                foreach (var item in e.GetType().GetFields())
                {
                    var enumAttributes = (DescriptionAttribute[])item.GetCustomAttributes(typeof(DescriptionAttribute), false);
                    if (enumAttributes.Length > 0)
                    {
                        descriptionDic.TryAdd(item.Name, enumAttributes[0].Description);
                    }
                }
                _enumDic.TryAdd(fullName, descriptionDic);
                descriptionDic.TryGetValue(e.ToString(), out description);
            }
        }
        return description;
    }

    /// <summary>
    /// 将指定枚举类型转换成List
    /// </summary>
    /// <param name="enumType">枚举类型</param>
    /// <returns>以key/Val的方式返回枚举集合</returns>
    public static List<KeyValuePair<string, int>> GetEnumKeyValueList(Type enumType)
    {
        return ConvertEnumToList(enumType);
    }

    /// <summary>
    /// 将指定枚举类型转换成List
    /// </summary>
    /// <param name="enumType">枚举类型</param>
    /// <returns>以key/Val的方式返回枚举集合</returns>
    public static List<KeyValuePair<string, int>> ConvertEnumToList(Type enumType)
    {
        var list = new List<KeyValuePair<string, int>>();
        if (enumType.IsEnum == false) { return null; }
        var typeDescription = typeof(DescriptionAttribute);
        var fields = enumType.GetFields();
        foreach (var field in fields.Where(field => !field.IsSpecialName))
        {
            var strValue = field.GetRawConstantValue().ToString();
            var arr = field.GetCustomAttributes(typeDescription, true);
            var strText = arr.Length > 0 ? ((DescriptionAttribute)arr[0]).Description : field.Name;
            var item = new KeyValuePair<string, int>(strText, Convert.ToInt32(strValue));
            list.Add(item);
        }
        return list;
    }

    /// <summary>
    /// 将枚举类型转换成ListModel
    /// </summary>
    /// <param name="enumType">枚举类型</param>
    /// <returns>枚举集合</returns>
    public static List<EnumModel> GetEnumModelList(Enum enumType)
    {
        return ConvertEnumModelToList(enumType);
    }

    /// <summary>
    /// 将枚举类型转换成ListModel
    /// </summary>
    /// <param name="enumType">枚举类型</param>
    /// <returns>枚举集合</returns>
    public static List<EnumModel> ConvertEnumModelToList(Enum enumType)
    {
        var enumModelList = new List<EnumModel>();
        var typeDescription = typeof(DescriptionAttribute);
        var fields = enumType.GetType().GetFields();
        foreach (var field in fields.Where(field => !field.IsSpecialName))
        {
            EnumModel model = new EnumModel();
            model.Val = Convert.ToInt32(field.GetRawConstantValue());
            model.Text = field.Name;
            var arr = field.GetCustomAttributes(typeDescription, true);
            model.Description = arr.Length > 0 ? ((DescriptionAttribute)arr[0]).Description : string.Empty;
            enumModelList.Add(model);
        }
        return enumModelList;
    }

    /// <summary>
    /// 绑定枚举
    /// </summary>
    /// <param name="typeInfo">枚举类型</param>
    /// <param name="showDefault">显示默认</param>
    /// <param name="selectValue">默认选中值</param>
    /// <returns>列表项</returns>
    public static List<SelectListItem> BindEnum(Type typeInfo, bool showDefault, string selectValue = "")
    {
        var enumItems = showDefault
            ? new List<SelectListItem> { new SelectListItem { Text = "---全部---", Value = "-1" } }
            : new List<SelectListItem>();
        var enumList = EnumExtension.ConvertEnumToList(typeInfo);
        if (enumList != null && enumList.Any())
        {
            enumItems.AddRange(enumList.Select(p => new SelectListItem { Text = string.Format("---{0}---", p.Key), Value = p.Value.ToString() }));
            if (!string.IsNullOrEmpty(selectValue))
            {
                foreach (var item in enumItems)
                {
                    item.Selected = item.Value.Equals(selectValue);
                }
            }
        }
        return enumItems;
    }
}

/// <summary>
/// 枚举对象
/// </summary>
public class EnumModel
{
    /// <summary>
    /// 属性值 例 Man
    /// </summary>
    public string Text { get; set; }

    /// <summary>
    /// INT 值 例 1
    /// </summary>
    public int Val { get; set; }

    /// <summary>
    /// Description 特性值 [Description("男")]
    /// </summary>
    public string Description { get; set; }
}

//
// 摘要:
//     Represents the selected item in an instance of the System.Web.Mvc.SelectList
//     class.
public class SelectListItem
{
    //
    // 摘要:
    //     Gets or sets a value that indicates whether this System.Web.Mvc.SelectListItem
    //     is selected.
    //
    // 返回结果:
    //     true if the item is selected; otherwise, false.
    public bool Selected { get; set; }

    //
    // 摘要:
    //     Gets or sets the text of the selected item.
    //
    // 返回结果:
    //     The text.
    public string Text { get; set; }

    //
    // 摘要:
    //     Gets or sets the value of the selected item.
    //
    // 返回结果:
    //     The value.
    public string Value { get; set; }

    //
    // 摘要:
    //     Initializes a new instance of the System.Web.Mvc.SelectListItem class.
    public SelectListItem()
    {
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StevenChen85

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值