定制Attribute
目录
- Attribute是什么
- 自定义Attribute
一、Attribute是什么
将一些附加信息与制定目标相关联的方式。编译器在元数据中生成这些额外的信息。也叫做特性。
比如之前文章中提到的:枚举类型与位运算。也是向枚举类型定制了[FlagsAtribute]特性,将枚举类型作为一个位标识集合使用。
[Flags]
public enum Options
{
None=,
Insert = , //二进制: 0001
Update = , //二进制: 0010
Save = , //二进制: 0100
Delete = , //二进制: 1000
Query = //二进制:10000
}
Attribute使用[]进行标记说明,会在某个目标元素的上方,这里的Flags是FlagsAttribute的简写。
1、那我们F12看一下[Falags]的定义:
public class FlagsAttribute : Attribute
{
// 摘要:
// 初始化 System.FlagsAttribute 类的新实例。
public FlagsAttribute();
}
FlagsAttribute直接或者间接继承自Attribute。当然我们也可以看出所说的Flags特性就是一个类的实例。既然是类的实例,需要有构造方法,所以我们也就看到了上面的构造函数FlagsAttribute。
我们写的[Falags]实际是调用了public FlagsAttribute();构造函数。
2、那我们再来一个例子,先不管这句话什么意思,或者作用是什么。
[DllImport("Json.Text", CharSet = CharSet.Auto,BestFitMapping=true)]
public void GetNewMail(string from, string to, string msg)
{
MailInfo newmailinfo = new MailInfo(from, to, msg);
OnNewMail(newmailinfo); }
我们同样F12看一下定义:
public sealed class DllImportAttribute : Attribute
{
public bool BestFitMapping; public CharSet CharSet; public DllImportAttribute(string dllName); public CallingConvention CallingConvention;
public string EntryPoint;
public bool ExactSpelling;
public bool PreserveSig;
public bool SetLastError;
public bool ThrowOnUnmappableChar;
public string Value { get; }
}
但是这里的构造函数是接受一个String类型的参数,但是我们调用时却是这样写
[DllImport("Json.Text", CharSet = CharSet.Auto,BestFitMapping=true)]
这里的第一个参数是狗咱好书默认的参数,而后面的是DllImportAttribute类中的公共属性或者公共字段,那就不难理解我们这里直接调用了里面的两个公共属性并给他们做了赋值。
那就不难理解这些为什么会这样写了:
[Table("Menu", Schema = "admin")]
3、多个Attribute组合
[Flags]
[DllImport("Json.Text", CharSet = CharSet.Auto, BestFitMapping = true)]
public enum Options
{
None=,
Insert = , //二进制: 0001
Update = , //二进制: 0010
Save = , //二进制: 0100
Delete = , //二进制: 1000
Query = //二进制:10000
}
我们也可以这样写,两个特性用,分隔:
[Flags, DllImport("Json.Text", CharSet = CharSet.Auto, BestFitMapping = true)]
二、自定义Attribute
如何根据需求定义我们自己的特性,通过以上的了解,我们至少知道我们的Attribute直接或者间接继承基类Attribute,并且要有实例构造函数进行构造。也可以定义一些需要的公共属性等等。
当然命名也要符合约定以Attribute为后缀。
[System.AttributeUsage(System.AttributeTargets.Class |System.AttributeTargets.Struct,
AllowMultiple = true,
Inherited = true
)]
public class MarkAttribute : System.Attribute
{
public string appname;
public double version = 1.0; public MarkAttribute(string appname)
{
this.appname = appname;
}
}
我们定义一个MarkAttribute,我们约定我们自定义的特性符合AttributeUsage特性:目标元素为类或者结构,允许多个属性,可以继承。
我们自己定义的MarkAttribute,有两个公共字段appname和version。并有一个构造函数。
这样我们这样运用自己的简单的特性:
[Mark("Apple", version = 2.0)]
public class APP
{
}
既然定义了,也标注到了特定的目标上,剩下的就是我们调用了。
通过反射来调用我们定义的特性:
System.Attribute[] attrs = System.Attribute.GetCustomAttributes(typeof(MarkAttribute)); // Reflection. foreach (System.Attribute attr in attrs)
{
if (attr is MarkAttribute)
{
MarkAttribute m = (MarkAttribute)attr;
System.Console.WriteLine(" {0}, 版本 {1:f}",m.appname,m.version);
}
}
这样我们就完成了我们自定义的特性并完成调用。
但是编译器是如何调用Attribute的呢?
编译器检测到一个元素应用到一个元素应用到attribute的时候,编译器会调用attribute类的构造器,向他传递参数,就构造了一个实例,
编译器再根据特定的语法对公共字段和属性进行初始化,并将这些信息驻留到元数据中。这只是会生成相关的元数据。
那编译器又是如何调用特性的呢?
和我们上面的例子类似,通过反射。我们知道所有的特性都继承自Attribute,我们F12转到定义可以看到,基类Attribute主要有三组方法组成:
GetCustomAttribute:返回应用的一个特性.
GetCustomAttributes:返回应用的多个特性.
IsDefined:检测判断元素是否应用Attribute.
总结,我们知道什么是Attribute,并可以自定义Attribute.
定制Attribute的更多相关文章
- C# 定制 Attribute 简单使用
所谓 “定制Attribute”,就是一个类的实例,它被序列化成驻留在元数据的一个字节流. 我们可以使用 Attribute 来保存注释: namespace AttributeDemo { [Att ...
- [Clr via C#读书笔记]Cp18 定制Attribute
Cp18 定制Attribute 意义 利用Attribute,可以声明性的给自己的代码结构创建注解,从而实现一些特殊的功能:最终在元数据中生成,这种可扩展的元数据信息可以在运行时的时候查询,从而动态 ...
- C#提高------------------------Attribute自定制概念
C#基础知识梳理系列八:定制特性Attribute 摘 要 设计类型的时候可以使用各种成员来描述该类型的信息,但有时候我们可能不太愿意将一些附加信息放到类的内部,因为这样,可能会给类型本身的信息描 ...
- Attribute
Attribute介绍 咱们来说Attribute,他是一个类,所以自定义的Attribute都是继承自System.Attribute,一般命名的时候都是以Attribute结尾.在使用的时候我们可 ...
- 有关C#标签Attribute的熟悉
Attribute 简单用法: 最近用到了,所以静下心来找些资料看了一下,终于把这东西搞清楚了. 一.什么是Attribute 先看下面的三段代码: 1.自定义Attribute类:VersionAt ...
- [CLR via C#]18. Attribute
attribute可以说是Microsoft .NET Framework提出的最具创意的技术之一了.利用attribute,可以声明性的为自己的代码构造添加注解,从而实现一些特殊的功能.attrib ...
- C# Attribute 特性 学习
一.特性的概述 公共语言运行库允许您添加类似关键字的描述性声明(称为特性 (Attribute))来批注编程元素,如类型.字段.方法和属性 (Property).属性与 Microsoft .NET ...
- .Net Attribute特性
1.什么是Atrribute 首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标 ...
- 读书笔记—CLR via C#委托和attribute
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
随机推荐
- 关于埃博拉(Ebola)基础研究病毒
关于埃博拉(Ebola)病毒的基础研究 2005年.美国哈佛大学医学研究院(Harvard Medical School)James Cunningham教授关于埃博拉病毒有一项基础研究,研究成果发表 ...
- oracle数据库恢复与备份
一.oracle数据库恢复 1.恢复刚才删除的一条数据 delete from emp e where e.empname='SMITH' select * from flashback_transa ...
- J2EE的13个规范之JDBC
假设让你接触一样新的东西.你可能感觉无所适从,可是假设本来就是旧事物的话,你学习起来还难吗? 一.ODBC,我们的老朋友 ODBC(Open Database Connectivity)是微软公司与数 ...
- hdu1005 Number Sequence(寻找循环节)
主题链接: pid=1005">huangjing 题意: 就是给了一个公式,然后求出第n项是多少... 思路: 题目中n的范围实在是太大,所以肯定直接递推肯定会超时,所以想到的是暴力 ...
- BZOJ 2002 HNOI2010 弹飞羊 块
标题效果,LCT解释版本:见 http://blog.csdn.net/popoqqq/article/details/38849471 如今,用一只手滑动块,并再次改写这个问题0.0 块短啊 将进入 ...
- 如何自动以管理员身份运行.NET程序?
原文:如何自动以管理员身份运行.NET程序? windows 7和vista提高的系统的安全性,同时需要明确指定“以管理员身份运行”才可赋予被运行软件比较高级的权限,比如访问注册表等.否则,当以普通身 ...
- FlexPaper二次开发问题及搜索高亮显示
原文:FlexPaper二次开发问题及搜索高亮显示 最近有个需求,做一个IT知识库,类似于文库,说到文库肯定会用到在线浏览文档了,所有在网上翻阅了一下类似豆丁的在线浏览器插件的资料,将其进行了二次开发 ...
- 玩转web之ajax(一)---使用表单的serialize()方法中文乱码解决
有时候我们需要使用ajax提交去提交form的值,这样就需要使用serialize()去获取form的值,但这样获取的值如果有中文,会乱码,原因和解决方法如下: 原因:.serialize()自动调用 ...
- Java 过滤器的作用
Servlet API 非常久曾经就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充.在 J2EE 探索者 系列文章的最后一篇中,作者 Kyle Gabhar ...
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)(转)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...