zoukankan      html  css  js  c++  java
  • 为枚举(enum)类型添加的备注属性,并且获取枚举的属性值

    为枚举(enum)类型添加的备注属性,并且获取枚举的属性值

    枚举类型(也称为枚举)是非常有意思的的一种值类型,它不仅可以提高程序的可读性,而且可以减少因业务改变而导致的程序改动。

    另外枚举类型是强类型,接受方法必须有一个相同的匹配参数,否则将会出错。

    好,废话少说,至于枚举类型(emun)的特性,几乎会编程的人都懂的,偶没功力在这里长篇大论。

    下面是一个例子,偶还是按官方的写法,以星期为例子:

    代码

    class Program
    {
    static void Main(string[] args)
    {

    Console.Write(GetDays(Days.Saturday));
    Console.Read();
    }

    static string GetDays(Days _days)
    {
    string d = string.Empty;
    switch (_days)
    {
    case Days.Monday: d = "Today is Monday."; break;
    case Days.Tuesday: d = "Today is Tuesday."; break;
    case Days.Wednesday: d = "Today is Wednesday."; break;
    case Days.Thursday: d = "Today is Thursday."; break;
    case Days.Friday: d = "Today is Friday."; break; ;
    case Days.Saturday: d = "Today is Saturday."; break;
    case Days.Sunday: d = "Today is Sunday."; break;
    }
    return d;
    }

    }

    public enum Days
    {
    /// <summary>
    /// this is sunday
    /// </summary>
    Sunday = 7,
    /// <summary>
    /// this is monday
    /// </summary>
    Monday = 1,
    /// <summary>
    /// this is tuesday
    /// </summary>
    Tuesday = 2,
    /// <summary>
    /// this is wednesday
    /// </summary>
    Wednesday = 3,
    /// <summary>
    /// this is thursday
    /// </summary>
    Thursday = 4,
    /// <summary>
    /// this is friday
    /// </summary>
    Friday = 5,
    /// <summary>
    /// this is saturday
    /// </summary>
    Saturday = 6
    };

    很明显,"Today is Saturday." 当然是输出结果,可问题来了,这只是一个枚举,7条枚举值记录,假如,我要改成:hi ,cora ! this is saturday. 然后其他另外6条都不一样的,假设我们有100个或者更多这样的枚举值(只是里面的值)要更改,业务层方法GetDays这样的方法岂不是大改?(当然这只是假设,如果真实的话,或许会有更灵活的方式去处理)

    晕了,小菜的又开始说BT了...

    然后,我把程序稍稍改了一下,加了一个公共的类RemarkAttribute的类,然后加了一个remark的属性:

    代码

    public class RemarkAttribute : Attribute
    {
    private string _remark;
    public RemarkAttribute(string _remark)
    {
    this._remark = _remark;
    }
    public string Remark
    {
    get { return _remark; }
    set { _remark = value; }
    }

    public static string GetEnumRemark(System.Enum _enum)
    {

    Type type = _enum.GetType();
    FieldInfo fd = type.GetField(_enum.ToString());
    if (fd == null) return string.Empty;
    object[] attrs = fd.GetCustomAttributes(typeof(RemarkAttribute), false);
    string name = string.Empty;
    foreach (RemarkAttribute attr in attrs)
    {
    name = attr.Remark;
    }
    return name;
    }
    }

    然后把GetDays方法去掉,并且枚举加上一个属性并且加上一个属性值:

    代码

    class Program
    {
    static void Main(string[] args)
    {

    Console.Write(RemarkAttribute.GetEnumRemark(Days.Wednesday));
    Console.Read();
    }

    }

    public enum Days
    {
    /// <summary>
    /// this is sunday
    /// </summary>
    [Remark("this is sunday")]
    Sunday = 7,
    /// <summary>
    /// this is monday
    /// </summary>
    [Remark("this is monday")]
    Monday = 1,
    /// <summary>
    /// this is tuesday
    /// </summary>
    [Remark("this is tuesday")]
    Tuesday = 2,
    /// <summary>
    /// this is wednesday
    /// </summary>
    ///
    [Remark("this is wednesday")]
    Wednesday = 3,
    /// <summary>
    /// this is thursday
    /// </summary>
    [Remark("this is thursday")]
    Thursday = 4,
    /// <summary>
    /// this is friday
    /// </summary>
    [Remark("this is friday")]
    Friday = 5,
    /// <summary>
    /// this is saturday
    /// </summary>
    [Remark("this is saturday")]
    Saturday = 6
    };

    好了,原来的业务处理方法GetDays可以省掉了,假设(偶好象比较喜欢假设),假设我们有100个或者更多个这样的枚举值要更改,那么我们只要把Remark的属性值改一下就可以了,业务层完全不用动(当然,连整个枚举都要更改的话,我就没办法喽)。

    比较简单吧?个人而言还是比较喜欢简单而又不失经典的编码方式,或者园子里的朋友有更好的方式,不防提出来分享一下吧。

  • 相关阅读:
    Angularjs 设置全局变量的3种方法
    prevent to do sth 与 prevent sb (from) doing 用法
    软件测试技术对程序员的重要性
    Javascript中setTimeout()以及clearTimeout( )的使用
    Javascript异步编程的常用方法
    软件设计原则总结
    为sublime Text3 安装插件JS Format
    javascript中 if(变量)和if(变量==true)的区别
    Ping 命令
    ipconfig
  • 原文地址:https://www.cnblogs.com/hdl217/p/1724934.html
Copyright © 2011-2022 走看看