马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

C#中的Attribute使用

[复制链接]
查看3437 | 回复1 | 2018-2-10 15:42:13 | 显示全部楼层 |阅读模式
概述:Attribute用来描述类、属性、枚举等,可通过自定义的Attribute达到想要表述东西,通过反射获取这些表述。
下面使用了一个自定义的时间属性来描述定义的时间枚举,最后通过反射加载获取这些枚举的描述。

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

1.首先定义一个Attribute,这个Attr是我们自定义的,他继承自Attribute类,在这个属性中,定义一个构造函数用于等会儿对枚举字段的描述,同时定义一个Name属性来显示枚举字段的描述。
[C#] 纯文本查看 复制代码
    /// <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
[C#] 纯文本查看 复制代码
    /// <summary>
    /// 时间类型
    /// </summary>
    public enum TimeType
    {
        /// <summary>
        /// 年
        /// </summary>
        [TimeAttr("年")]
        Year,

        /// <summary>
        /// 月
        /// </summary>
        [TimeAttr("月")]
        Month,

        /// <summary>
        /// 日
        /// </summary>
        [TimeAttr("日")]
        Data,

        /// <summary>
        /// 时
        /// </summary>
        [TimeAttr("时")]
        Hour,

        /// <summary>
        /// 分
        /// </summary>
        [TimeAttr("分")]
        Minute,

        /// <summary>
        /// 秒
        /// </summary>
        [TimeAttr("秒")]
        Second
    }


3.通过反射来加载这些Attr,拿到我们需要的东西,微软MSDN对反射有详细说明,这里写了一个针对TimeType的反射
[C#] 纯文本查看 复制代码
    /// <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.我们来获取这些反射的值看看效果
[C#] 纯文本查看 复制代码
            //单个获取
            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 | 显示全部楼层
新年快乐~~
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则