• .Net的特性(attribute)


    特性本质上是一个类,其为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息;(attribute和.net framework 文件的元数据保存在一起,可以用来在运行时描述你的代码,或者在程序运行的时候影响应用程序的行为)所谓的定制特性就是为目标元素,可以是数据集,类,方法,属性,类似于注释,但是可以在运行期以反射的方式获得,定制特性主要应用在序列化,编译器指令,设计模式等方面;

    目标元素包括:assembly   module   type  property   event   field   method   param   return
    (其实关于数组来接受任意长度的参数就是用特性来做出来的)
    其在编译期进行初始化而不是运行期;


    几个习惯用法:
     自定义特性必须直接或间接继承自System.Attribute类而且该类必须要有公有的构造函数;
     自定义特性应该有一个Attribute后缀,习惯约定(在调用中可以省略,会自动匹配);
     非抽象特性必须要有public访问权限;
     定制特性不会影响应用元素的任何功能,只是约定了该元素具有的特质;


    如果没有什么机制在运行期获取attribute的附加信息,那么attribute就没有什么存在的意义,因此 .net中用反射的机制来实现在运行期获取attribute信息;


     [AttributeUsage(AttributeTargets.Class |
            AttributeTargets.Method,AllowMultiple =true , Inherited = true)] (可应用多次,不可以继承到派生类)
        public class testAttribute : System.Attribute
        {
            public  string name;
            public testAttribute()
            { }
        }
        [test(name ="itis my first program")]
        public class mytext
        {
            public void ok()
            {
                Console.WriteLine("my text word!");
            }
        }
        class Program
        {
           
            static void Main(string[] args)
            {
                MemberInfo info = typeof(mytext);           //或者对象名.GetType() 得到的实际上是Type类型;
                object []attribute;
                attribute =info.GetCustomAttributes(typeof(testAttribute), true);
                foreach (object a in attribute)
                {
                    testAttribute x = (testAttribute)a;
                    Console.WriteLine(x.name );
                }                                                                     //获取对象的属性
    (其实就是人为付在类体上面的一些说明);

                Assembly d = Assembly.Load("Mscorlib");
                Type[] types = d.GetTypes();
                int i = 0;
                foreach (Type a in types)
                {
                    Console.WriteLine(a);
                    Console.Read();
                    i++;
                }
                Console.WriteLine(i.ToString ());                                   //查看一个程序集的内容

    关于Type:
    可以看作是一个类,但实际上时一个抽象的基类,type于每种数据类型都有对应的Type的派生类,一般派生的类只提供各种Tyep方法和属性的不同重载,以返回对应数据类型的正确数据
    获取指向给定类型的Type引用由3种方式:
    ·使用c#typeof运算符,参数是类型的名称;
    ·使用GetType()方法,所有类都会从object类中继承这个方法;(确定该实例的类型)
    ·调用Type类的静态方法GetType();

    type是许多反射技术的入口,可用的属性都是可读的,可以使用Type确定数据的类型,但不能修改该类型;
    (整个反射机制的枢纽)

    反射机制:
    第一步:Assembly.Load("")/.LoadFrom("") 加载程序集;
    第二步:   a.调用.GetTypes(),返回所有该程序集中的类型;
     b.或者调用特性静态方法Attribute.GetCustomAttributes(Assemble x) ,返回该程序集中所有包含的特性
     (有一个重载的方法,第二个参数为指定特性的Type,即返回该程序集所有的该特性的集合)
    第三步:   a.调用Type的各种属性,如GetMethods()等,查找制定方法字段属性的 信息;
     b.将特性转换为(显示)已知的特性,再调用特性的方法等;
    第四步:用methodinfo 等直接调用GetCustomAttributes ()以获得与该方法有关的特性;

  • 相关阅读:
    【C语言入门教程】5.6 函数库和文件
    【C语言入门教程】5.5 实现问题(效率)
    【C语言入门教程】5.4 递归
    【C语言入门教程】5.3 函数的调用 与 参数
    【C语言入门教程】5.2 函数的作用域规则(auto, static)
    bootstrap之双日历时间段选择控件示例—daterangepicker(中文汉化版)
    PHP导出数据到CSV文件函数 csv_export()
    MySQL 5.6 Warning: Using a password on the command line interface can be insecure
    【定时任务|开机启动】Windows Server 2008/2012 计划任务配置(任务计划程序)每分钟执行BAT
    【风雪之隅】写在PHP7发布之际一些话 2015-12-02
  • 原文地址:https://www.cnblogs.com/yemaxu/p/4529623.html
Copyright © 2020-2023  润新知