.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 ()以获得与该方法有关的特性;

时间: 2024-10-03 21:10:52

.Net的特性(attribute)的相关文章

.NET基础编程之特性 - Attribute

这一篇文章是给大家介绍的是:.NET基础编程之特性 - Attribute,对这一部分掌握不熟悉的同学,可以仔细的看一下! 一.特性简介 特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联.特性与程序实体关联后,可在运行时使用"反射"查询特性. 特性具有以下属性: (1)特性可向程序中添加元数据.元数据是有关在程序中定义的类型的信息.所有的 .NET 程序集都包含指定的一组元数据,这些元数据描述在程序集中定义的类型和类型成员.可以添加自定义特性,以

C# 知识特性 Attribute

C#知识--获取特性 Attribute 特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联.特性与程序实体关联后,可在运行时使用"反射"查询特性,获取特性集合方法是GetCustomAttributes(); 根据约定,所有特性名称都以单词"Attribute"结束,以便将它们与".NET Framework"中的其他项区分.但是,在代码中使用特性时,不需要指定 attribute 后缀.在声明特性类时要以

[C#] 剖析 AssemblyInfo.cs - 从这里了解常用的特性 Attribute

剖析 AssemblyInfo.cs - 从这里了解常用的特性 Attribute [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5944391.html 序 上次,我们通过<C# 知识回顾 - 特性 Attribute>已经了解如何创建和使用特性 Attribute,这次,让我们一起来看看每次使用 VS 创建项目时所自带的文件 AssemblyInfo.cs. 目录 核心代码 展开图中的代码,看箭头↓ using System.Reflecti

.NET特性-Attribute

两篇文章有助于学习Attribute特性的概念. http://blog.csdn.net/byondocean/article/details/6802111 http://www.cnblogs.com/JimmyZhang/archive/2008/01/27/1055254.html .NET特性-Attribute

.Net内置特性Attribute介绍

特性Attribute概述 特性(Attribute)是一种特殊的类型,可以加载到程序集或者程序集的类型上,这些类型包括模块.类.接口.结构.构造函数.方法.字段等,加载了特性的类型称之为特性的目标.这里为与属性(Property)区分,所以称之为特性(Attribute).特性是为程序集添加元数据的一种机制,通过它可以为编译器提供指示或者对数据进行说明.例如前段时间学习的Remoting技术(主要用于应用程序域之间的对象通信)中在应用程序域间的引用对象时该对象具有序列化(Serializabl

区分元素特性attribute和对象属性property

其实attribute和property两个单词,翻译出来都是属性,但是<javascript高级程序设计>将它们翻译为特性和属性,以示区分.本文将详细介绍特性和属性的不同之处 定义 元素特性attribute是指HTML元素标签的特性 下面的id.class.title.a都是特性,其中a叫做自定义特性 <div id="id1" class="class1" title="title1" a='a1'></div

.net之特性(Attribute)

看了一些关于这方面的文档,自我总结: 特性(Attribute)就是对一个方法或类做的一个额外的属性说明,也就是附加说明 下面是我自己抄的一个实例程序: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace SomeTest { class Program { static void Main(string[]

C# 自定义特性Attribute

一.特性Attribute和注释有什么区别 特性Attribute A:就是一个类,直接继承/间接继承Attribute B:特性可以在后期反射中处理,特性本身是没有什么*用的 C:特性会影响编译和运行时功能 注释 A:就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码.注释是编写程序时,写程序的人给一个语句.程序段.函数等的解释或提示,能提高程序代码的可读性 B:注释不能后期处理 二.自定义Attribute特性的使用 自定义Attribute特性的语法 其实特性就是一个类,直接继承

C# 特性(Attribute)(二)

AttributeUsage类是另外一个预定义特性类,它帮助我们控制我们自己的定制特性的使用.它描述了一个定制特性如和被使用.    AttributeUsage有三个属性,我们可以把它放置在定制属性前面.第一个属性是:    ValidOn    通过这个属性,我们能够定义定制特性应该在何种程序实体前放置.一个属性可以被放置的所有程序实体在AttributeTargets enumerator中列出.通过OR操作我们可以把若干个AttributeTargets值组合起来.    AllowMu

C# 特性(Attribute)(一)

特性(Attributes)是一种崭新的声明性信息.我们不仅可以通过特性来定义设计层面的信息(例如help file, URL for documentation)以及运行时(run-time)信息(例如使XML与class相联系),而且我们还可以利用特性建立自描述(self- describing)组件.在这篇教程中,我们将会看到如何建立和添加特性到各种程序实体以及如何在运行时环境中获取特性信息.   定义   正如MSDN中所描述的那样-----     “特性是被指定给某一声明的一则附加的