zoukankan      html  css  js  c++  java
  • C# 特性(Attribute)

    个人定义:不侵入对象的情况下,添加对象附注信息。

    官方定义:将预定义的系统信息或用户定义的自定义信息与目标元素相关联。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模   块、参数、属性 (Property)、返回值、结构或其他属性 (Attribute)。提供的信息也称为元数据,元数据可由应用程序在运行时进行检查以控制程序处理数据的方式,也可以由外部工具在运行前检查以控制应用程序处理或维护自身的方式。

    .Net 框架提供了三种预定义特性:

    • AttributeUsage
    • Conditional
    • Obsolete

    示例: 读取枚举值上加的 特性信息

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyAttribute
    {
        [Obsolete("这是一个过期特性")]
        public enum EnumState
        {       
            [Remark("我是打开")]
            //[Remark("")]
            Open =1,
            [Remark("我是关闭")]
            Close=2
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyAttribute
    {
      //1.特性的适用范围  2.特性是否允许用多次 3.特性是否被派生类继承
        [AttributeUsage(AttributeTargets.All,AllowMultiple =true, Inherited =true)]
      //被调用时执行条件编译,取决于指定的值(如“DEBUG”,"RELEASE"...)
        [Conditional("DEBUG")]
        public class RemarkAttribute:Attribute
        {
            public string remark;
    
            public string Remark
            {
                get { return remark; }
            }
    
            public RemarkAttribute(string remark)
            {
                this.remark = remark;
            }
        }
    
        public static class RemarkExtend
        {
            public static string RemarkDescription(this EnumState state)
            {
                Type type = typeof(EnumState);
                FieldInfo info= type.GetField(state.ToString());
                object[] remarkCustomAttribute= info.GetCustomAttributes(typeof(RemarkAttribute),false);     
                if(remarkCustomAttribute != null && remarkCustomAttribute.Length>0)
                {
                    RemarkAttribute remarkattribute = remarkCustomAttribute[0] as RemarkAttribute;
                    return remarkattribute.Remark;
                }
                else
                {
                    return state.ToString();
                }
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyAttribute
    {
        class Program
        {
            static void Main(string[] args)
            {
                EnumState state = EnumState.Open;
                Console.WriteLine(state.RemarkDescription());
                Console.Read();
            }
        }
    }

    至此,关于特性的学习就到此结束了,谢谢您的阅读。

    特性还有很多高级的用法,博主只是小试牛刀,希望本文能够帮到你,当然若有不完善地方,欢迎斧正。

    参考MSDN:https://msdn.microsoft.com/zh-cn/library/system.attribute(VS.80).aspx

  • 相关阅读:
    刷题篇--热题HOT 71-80
    刷题篇--热题HOT 61-70
    双飞翼布局介绍-始于淘宝UED
    css布局——百度前端技术学院
    CSS多列布局Multi-column、伸缩布局Flexbox、网格布局Grid详解
    CSS之BFC详解
    深入理解BFC和Margin Collapse
    CSS 布局_如何实现容器中每一行的子容器数量随着浏览器宽度的变化而变化?
    3列、2列自适应布局,中部内容优先显示3列布局等方法
    三列布局,中间自适应
  • 原文地址:https://www.cnblogs.com/jdzhang/p/6910900.html
Copyright © 2011-2022 走看看