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

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

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

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

获取枚举Name其实很简单:

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

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

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呢?

增加这个命名空间:

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这样的表述,多爽!

可是如果我的项目里头定义了多个枚举类型,比如还有一个操作状态:

    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值了:

        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改造成DisplayEnumDescription呢?在直接套用上面的程序时,这一行:

DescriptionAttribute[] EnumAttributes = (DescriptionAttribute[])(enumType.GetField(obj.ToString())).GetCustomAttributes(typeof(DescriptionAttribute), false);

出现了NullException的错误,也就是说Enum.GetName(enumType, value)里头eNumType可以当[InOrOute]这个类型用,但eNumType并不能直接对应原来的[InOrOut].GetType(),目前还没研究出解决办法。

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

时间: 2024-10-15 10:05:48

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

获取枚举类型Description特性的描述信息

C#中可以对枚举类型用Description特性描述. 如果需要对Description信息获取,那么可以定义一个扩展方法来实现.代码如下: public static class EnumExtensions { public static string GetDescription(this object value) { if (value==null) return string.Empty; Type type = value.GetType(); var fieldInfo = ty

Effective Java 第三版——34. 使用枚举类型替代整型常量

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. Java支持两种引用类型的特殊用途的系列:一种称为枚举类型的类和一种称为注解类型的接口. 本章讨论使用这些类型系列的最佳实践. 34. 使用枚举类型替代整型常量 枚举是其合

函数返回值类型为枚举类型

枚举是个好东西,它和结构体一样,都可以定义一种数据类型,但是枚举有一个更优点,就是它可以默认指定定义的初始值. 有一个项目,涉及到CPU卡,卡片有错误.上电.DF01目录等状态,如果单独定义这些变量,要使用很多变量,这里有一个规律,即:CPU卡不能同时为这几种状态中的几个,只能为其中的一个,这样,我们可以定义一个枚举类型变量,例如: //标识ic的几种状态typedef enum{     ICC_ERROR,       ICC_NO_EXIST,       ICC_EXIST,      

C++ Primer 笔记——枚举类型

1.和类一样,每个枚举类型定义了一种新的类型.枚举属于字面值常量类型. 2.C++包含两种枚举:限定作用域的和不限定作用域的.C++11新标准引入了限定作用域的枚举类型. enum class /*struct*/ MyEnum { A = 0}; // 限定作用域的枚举 enum class /*struct*/ MyEnum1 { A = 0 }; // 限定作用域的枚举可以有重复的名字,使用时也必须加上作用域 enum MyEnum2 { B = 0 }; // 不限定作用域的枚举 enu

C#之枚举类型

参考: http://www.cnblogs.com/an-wl/archive/2011/04/14/2015815.html 惯例先上MSDN: https://msdn.microsoft.com/zh-cn/library/cc138362(v=vs.110).aspx 枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法.例如,假设您必须定义一个变量,该变量的值表示一周中的一天.该变量只能存储七个有意义的值.若要定义这些值,可以使用枚举类型.枚举类型是使用en

C# 获取与解析枚举类型的 DescriptionAttribute

原文:C# 获取与解析枚举类型的 DescriptionAttribute System.ComponentModel.DescriptionAttribute 这个 Attribute,经常被用来为属性或事件提供说明,这个说明是可以被本地化的.在一些用户界面中,就可以利用这个 Attribute 提供一些额外的信息,就像 Visual Studio 中所做的,如图 1 所示: 图 1 可以看到,对 AutoSizeMode 的说明,被显示在了下面的框中. 但是,界面中的枚举项就没这么好的待遇了

C#中的枚举类型(enum type)

ylbtech 原文 C#中的枚举类型(enum type) 概念 枚举类型(enum type)是具有一组命名常量的独特的值类型.在以下示例中: enum Color { Red, Green, Blue } 声明一个名为 Color 的枚举类型,该类型具有三个成员:Red.Green 和 Blue. 枚举具体是怎么声明呢?枚举声明用于声明新的枚举类型.枚举声明以关键字 enum 开始,然后定义该枚举类型的名称.可访问性.基础类型和成员.具体格式: 修饰词(new.public.protect

C#语言基础——结构体和枚举类型

结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承. 用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等.这可以节省内存,因为没有如类对象所需的那样有额外的引用产生.例如,当声明含有成千上万个对象的数组时,这会引起极大的差异. 结构体是一个变量组,将一组变量放在一起,

java枚举类型学习

用的不多,但用的时候仅仅简单的使用,不太明白原理,今天就系统的学一下枚举.参考:java编程思想. 1.简单创建 枚举就是一个固定的集合,内容是声明的类. package com.test.java.tenum; /** * 一个简单的enum实例 * Created by Administrator on 2016/3/30. */ public enum SimpleEnumUse { NOT,MILD,MEDIUM,HOT,FLAMING } class TestSE{ public st