从一个int值显示相应枚举类型的名称或者描述

我正在作一个出入库管理的简单项目,在Models里定义了这样的枚举类型html

    public enum InOrOut
    {
        [Description("出库")]
        Out = 0,
        [Description("入库")]
        In = 1
    }

我想在输入参数为数据库字段值1或者0的时候,在页面上显示为枚举Name:In、Out,或者干脆显示为Description:出库、入库。数据库

获取枚举Name其实很简单:this

return Enum.GetName(typeof(InOrOut), value).ToString());

为了能在视图里经过调用@Html.DisplayInOrOut(item.InOrOut)的方式显示该枚举类型的Name,我扩展了HtmlHelper,在Controllers中增长一个HtmlExtensions.cs,在里面新增了一个EnumExtensions类,注意命名空间为System.Web.Mvc,这样才能在视图里以@Html.的方式调用:spa

namespace System.Web.Mvc
{
    public static class EnumExtensions
    {
        //显示Enum类型的Name值
        public static MvcHtmlString DisplayInOrOut(this HtmlHelper htmlHelper, int value)
return MvcHtmlString.Create(Enum.GetName(typeof(StockInOrOut), value).ToString()); 
    } 
    ... 
}

@Html.DisplayInOrOut(1)在视图里显示出来就是"In",可若是咱们要显示的是中文的Description呢?翻译

通常来讲,若是不用[Descript]标签的话,咱们须要编写一个翻译器,code

    public string DisplayInOrOutDescription(int value)
    {
        InOrOut obj=(InOrOut)value;
        string result = string.Empty;
        switch (obj)
        {
            case InOrOut.In:
                result = "入库";
                break;
            case InOrOut.Out:
                result = "出库";
                break;
            default:
                result = "";
                break;
        }
        return result;
    }

既然C#语言为咱们描述数据接口的时候DescriptionAttribute标签,为何很差好利用呢?htm

增长这个命名空间:blog

using System.ComponentModel;

将方法改形成:接口

        //显示Enum类型的Description值(若是有)或者Name值
        public static MvcHtmlString DisplayInOrOut(this HtmlHelper htmlHelper, int value)
        {
            if (!Enum.IsDefined(typeof(InOrOut), value))
            {
                return MvcHtmlString.Empty;
            }

            StockInOrOut obj = (InOrOut)value;
            DescriptionAttribute[] EnumAttributes = (DescriptionAttribute[])(obj.GetType().GetField(obj.ToString())).GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (EnumAttributes.Length > 0)
            {
                return MvcHtmlString.Create(EnumAttributes[0].Description);
            }
            return MvcHtmlString.Create(obj.ToString());
        }

这样在视图里出来的效果就是枚举类型里头定义的Description了:"出库""入库",还不影响数据库里的整型字段,又不影响程序里头的io=InOrOut.In这样的表述,多爽!ip

但是若是个人项目里头定义了多个枚举类型,好比还有一个操做状态:

    public enum LogStatus
    {
        [Description("操做未肯定")]
        UnConfirmed = -1,
        [Description("操做取消")]
        Cancel = 0,
        [Description("操做已肯定")]
        Confirmed = 1
    }

  那么也想把数据库中取得的字段值显示为该枚举的Description或者Name,势必又要定义一个大部分代码重复的DisplayLogStatus()的方法,能不能直接把枚举类型的名称做为变量带进方法呢?在方法里头再根据传入的名称还原出该枚举类型来。

我试了能够用该方法根据枚举类型的名称得到枚举类型:

Type enumType = Type.GetType("MvcApplicationName.Models.InOrOut");

必需要加上你的MvcApplicationName的命名空间,不然返回值为null,如今返回值是这样:

enumType {Name = "StockInOrOut" FullName = "MvcApplicationName.Models.StockInOrOut"} 

固然还有一堆属性:

 Assembly {MvcApplicationName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null} 等等

咱们利用这个反射回来的类型就能获得对应名称的枚举Name值了:

        //显示Enum类型的Name字段
        public static MvcHtmlString DisplayEnumName(this HtmlHelper htmlHelper, string enumTypeName, int value)
        {
            Type enumType = Type.GetType("StockManager.Models." + enumTypeName);
            if (!Enum.IsDefined(enumType, value))
            {
                return MvcHtmlString.Empty;
            }

            //若是只是要简单的返回枚举的Name值就只要这一行了
            return MvcHtmlString.Create(Enum.GetName(enumType, value));
        }

 

因而我在视图里这么用还挺爽的:

@Html.DisplayEnumName("LogStatus", item.Status)
@Html.DisplayEnumName("InOrOut", item.InOrOut)

 

若是我想把DisplayEnumName改形成可以显示Description呢?

再增长这个方法:

        //显示Enum类型的Description字段或者Name字段
        public static MvcHtmlString DisplayEnumDescription(this HtmlHelper htmlHelper, string enumTypeName, int value)
        {
            Type enumType = Type.GetType("StockManager.Models." + enumTypeName);
            if (!Enum.IsDefined(enumType, value))
            {
                return MvcHtmlString.Empty;
            }

            DescriptionAttribute[] EnumAttributes = (DescriptionAttribute[])(enumType.GetField(Enum.GetName(enumType, value))).GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (EnumAttributes.Length > 0)
            {
                return MvcHtmlString.Create(EnumAttributes[0].Description);
            }

            //若是只是要简单的返回枚举的Name值就只要这一行了
            return MvcHtmlString.Create(Enum.GetName(enumType, value));
        }

视图里的调用改为就好了:

@Html.DisplayEnumDescription("LogStatus", item.Status)
@Html.DisplayEnumDescription("InOrOut", item.InOrOut)
相关文章
相关标签/搜索