• ASP.NET中如何给枚举添加属性描述
  • 瓦缸没米 发表于 2014/9/26 10:32:00 | 分类标签: 枚举 ASP.NET 描述属性
  •  需求 :枚举类型在界面显示的时候可以显示相应的中文信息,这样界面对用户友好 . 场景 : 在一些业务中涉及到审核功能的时候, 往往有这几个状态 :未送审 , 审核中 ,审核通过, 驳回 . 这个时候我们会定义一个枚举类型来描述 :

    代码如下:

    1
    2
    3
    4
    5
    6
    7
    public enum AuditEnum
    {
      Holding=0,
        Auditing=1,
        Pass=2,
        Reject=3      
    }
    以asp.net为例 , 程序中某个方法可能会这样使用枚举值 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void HandleAudit(int userID, AuditEnum ae)
    {
      if (ae==AuditEnum.Pass)
      {
        //do something
      }
      else if (ae==AuditEnum.Reject)
      {
        //do other something
      }
    }
    asp.net页面往往需要显示中文枚举信息 :    
     

    序号
    项目
     状态
     审核人
    请假单
     审核通过
     张三

    解决方法 : 给枚举项增加DescriptionAttribute后利用反射来获取中文信息.
    步骤 :
    1.在定义枚举AuditEnum的类中添加名称空间System.ComponentModel , 给每个枚举项加DescriptionAttribute,示例代码如下 :
    代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    using System.ComponentModel;
    public enum AuditEnum
    {
        [Description("未送审")]
        Holding=0,  
      [Description("审核中")]
        Auditing=1,
        [Description("审核通过")]
        Pass=2,
        [Description("驳回")]
        Reject=3      
    }

    2 . 自定义一个类EnumService.cs , 增加静态方法GetDescription()根据传入的枚举值来读取Description信息,示例代码如下 :
     代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class EnumService
    {
        public static string GetDescription(Enum obj)
        {
            string objName = obj.ToString();
            Type t = obj.GetType();
            FieldInfo fi = t.GetField(objName);
            DescriptionAttribute[] arrDesc = 
    (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
            return arrDesc[0].Description;
        }
    }

    3 . 在输出枚举值的地方增加对EnumService.GetDescription()的调用 , 示例代码如下 :
    代码如下:

    asp.net页面代码
    <asp:Repeater ID="AuditRepeater" runat="server" OnItemDataBound="AuditRepeater_OnItemDataBound">
         <ItemTemplate>
             //something ui code is here ....
             <asp:Literal ID="AuditText" runat="server"></asp:Literal>
             //something ui code is here ....
         </ItemTemplate>
    </asp:Repeater>

    asp.net页面后台代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected void AuditRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs arg)
    {
            if (arg.Item.ItemType == ListItemType.Item)
            {
         Literal audit = arg.Item.FindControl("AuditText"as Literal;
                AuditEnum ae = AuditEnum.Pass; 
    //根据项目的实际情况赋值,这里为简化赋值AuditEnum.Pass            
                audit.Text = EnumService.GetDescription(we);
            }
    }

  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:瓦缸没米
  • 加入时间:2013/6/13 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮