飞/可爱朋 发表于 2018-2-10 15:42:13

C#中的Attribute使用

概述:Attribute用来描述类、属性、枚举等,可通过自定义的Attribute达到想要表述东西,通过反射获取这些表述。
下面使用了一个自定义的时间属性来描述定义的时间枚举,最后通过反射加载获取这些枚举的描述。

尴尬:date在这里被我写成了Data,不过不影响,主要学习思路就好。

1.首先定义一个Attribute,这个Attr是我们自定义的,他继承自Attribute类,在这个属性中,定义一个构造函数用于等会儿对枚举字段的描述,同时定义一个Name属性来显示枚举字段的描述。
    /// <summary>
    /// 用于时间类型的属性
    /// </summary>
    public class TimeAttr : Attribute
    {
      /// <summary>
      /// 时间属性的名称
      /// </summary>
      /// <param name="name">名称</param>
      public TimeAttr(string name)
      {
            Name = name;
      }

      /// <summary>
      /// 名称
      /// </summary>
      public string Name { get; private set; }
    }

2.定义一个需要的时间枚举,并使用我们定义的Attr
    /// <summary>
    /// 时间类型
    /// </summary>
    public enum TimeType
    {
      /// <summary>
      /// 年
      /// </summary>
      
      Year,

      /// <summary>
      /// 月
      /// </summary>
      
      Month,

      /// <summary>
      /// 日
      /// </summary>
      
      Data,

      /// <summary>
      /// 时
      /// </summary>
      
      Hour,

      /// <summary>
      /// 分
      /// </summary>
      
      Minute,

      /// <summary>
      /// 秒
      /// </summary>
      
      Second
    }

3.通过反射来加载这些Attr,拿到我们需要的东西,微软MSDN对反射有详细说明,这里写了一个针对TimeType的反射
    /// <summary>
    /// 反射类
    /// </summary>
    public class Reflect
    {
      /// <summary>
      /// 取得TimeType的Name属性
      /// </summary>
      /// <param name="timeType">类型</param>
      /// <returns>该枚举的属性说明</returns>
      public static string GetTimeName(TimeType timeType)
      {
            //反射
            Type type = typeof(TimeType);

            //取得枚举字段
            var field = type.GetField(timeType.ToString());

            //取得该字段的TimeAttr属性
            var attr = field.GetCustomAttributes(typeof(TimeAttr), true);

            //取得值,有且只有一个
            if (attr != null && attr.Length > 0)
                return (attr.First() as TimeAttr).Name;

            //无值
            return null;
      }

      /// <summary>
      /// 取得Time枚举的所有字段描述
      /// </summary>
      /// <returns>描述</returns>
      public static List<string> GetTimeNames()
      {
            //集合
            List<string> rel = new List<string>();

            //反射
            Type type = typeof(TimeType);
            foreach (var item in type.GetEnumNames())
            {
                //取得各个字段的描述
                rel.Add(GetTimeName((TimeType)Enum.Parse(type, item)));
            }

            //返回
            return rel;
      }
    }

4.我们来获取这些反射的值看看效果
            //单个获取
            Console.WriteLine("枚举字段Data的Attr:" + Reflect.GetTimeName(TimeType.Data));

            //所有的字段Attr
            foreach (var item in Reflect.GetTimeNames())
            {
                Console.WriteLine(item);
            }

下面是输出结果:

枚举字段Data的Attr:日







对枚举的Atrr的自定义就被我们拿到了,拿到这些数据之后就能做你想做的了。

总结:这种反射可支撑动态获取枚举的一些描述,你可以用在项目里面产生对枚举的下拉菜单,同时当你的需求发生变化时,增加了枚举的字段,但是UI不需要再做任何修改,可极大的提高程序的可扩展性。

ibcadmin 发表于 2018-2-24 09:22:29

新年快乐~~
页: [1]
查看完整版本: C#中的Attribute使用