Attribute是什么

  • Attribute的中文姓名

  为什么我要拿一段文字来说Attribute的中文姓名呢?答案是:因为这很重要。正所谓“名”不正,则言不顺;另外重构手法中有一种很重要的方法叫重命名,由此我们可以知道名称的定义是非常重要的。

Atrribute的中文姓名是特性,有些人也可能称之为属性;对于初学c#的人来说,可能很少接触到Atrribute,但Property想必一入门就有接触,而Property的中文姓名就叫属性,所以当我们说起属性时,自然而然就会想起Property,为了避免名称上的混淆,所以个人觉得在c#中还是把Attribute称之为特性为好。

对于刚接触Attribute时,我想大部分人会和我有一个一样的疑问就是Attribute和Property有什么关联呢?我想会产生这样的疑问就是因为中文名称的原因(在HTML里,一般把Attribute称之为属性)。如果你要问我这个问题的话,我的回答是——相当于Attribute和Class关联,我想你应该不会问我Attribute和Class有什么关联吧。

  • Attribute做什么用的?

  MSDN中对Attribute的定义是:Attribute 类将预定义的系统信息或用户定义的自定义信息与目标元素相关联。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性 (Property)、返回值、结构或其他属性 (Attribute)。

Attribute就是为目标元素提供附加信息的,简单来说Attribute就是为了为程序添加注释的,以进一步阐述其目标元素,那与我们平时添加的注释有什么区别呢?其区别就是注释是给人看的,程序在编译时会把注释忽略的,而Attribute是为程序注释的,所以编译器会把Attribute编译进程序集(Assembly)。

如果你还没弄懂Attribute是做什么用的话,你可以参考这篇文章,我就不再赘述了。

自定义Attribute

 [AttributeUsage(AttributeTargets.Property| AttributeTargets.Class, AllowMultiple = true)]
public class ColumnAttribute : Attribute
{
public string ColumnName { get; set; }
public string ColumnAlias { get; set; }
public ColumnAttribute(string columnName)
{
this.ColumnName = columnName;
}
}

  上面代码是我自定义的一个ColumnAttriubte类。所有自定的Attribute的必须继承自抽象类Attribute,就如上面代码所示。

下面我们来看一下如何把我们刚刚定义ColumnAttribute类使用上:

  public class SysUserInfo
{
[Column("UserID", ColumnAlias = "用户账号")]
public string UserID
{
get;
set;
} [ColumnAttribute("UserID")]
[ColumnAttribute("UserID", ColumnAlias = "用户账号")]
public string UserID
{
get;
set;
} [ColumnAttribute("UserID"), ColumnAttribute("UserID", ColumnAlias = "用户账号")]
public string UserID
{
get;
set;
} [ColumnAttribute("UserID", ColumnAlias = "用户账号"), ColumnAttribute("UserID")]
public string UserID
{
get;
set;
}
}

  上面代码仅仅只为说明这四种写法都是等价的。从上面的代码中我们可以看出使用自定义特性类ColumnAttribute时,可以省略“Attribute”。在此说明一下定义特性类时,我们约定在其类名后添加“Attribute”,当然你也可以不加,程序也一样正常运行,但建议加上,原因一:这是一个约定;原因二:当你的Attribute施加到一个程序的元素上的时候,编译器先查找你的Attribute的定义,如果没有找到,那么它就会查找“Attribute名称"+Attribute的定义。

在这儿我强调一下特性是非静态类,那既然是非静态类的话,不管间接还直接最终都要实例化时才能起实际效果,那按上所说那特性类是在哪儿实现化的呢?像我们平常实例化一个对象我们都要用到关键字new,但上面的例子哪里有new关键字呢?没有,这就是Attribute实例化比较怪异的地方,Attribute的实例化是在方括号([ ])里调用构造函数完成的,而构造函数的参数就是在特性后面的括号中传进去的,如上面的“UserID”便是构造函数的参数;这儿还有一点怪异的地方就是它实例化对象的属性赋值,属性赋值它是直接传递给构造函数的参数后面进行赋值的,如上面的ColumnAlias="用户账号”

AttributeUsageAttribute特性

  从MSDN对Attribute的定义中我们看到特性是与目标元素相关联的,而目标元素的种类则多达十几种。那我们想想如果没有什么约束的话,那使用起来想必有些混乱。

那Attribute类是怎么去限制其附加到哪些目标元素的呢?它是通过AttributeUsageAttribute来做的,我们注意到AttributeUsageAttribute它也是Attribute,正所谓物以类聚。AttributeUsage类的作用就是帮助我们控制定制特性的使用。

  转到其定义我们可以看到AttributeUsageAttribute中有三个属性:枚举类型AttributeTargets的ValidOn、布尔类型的AllowMultiple和Inherited。如下图:

aaarticlea/png;base64,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" alt="" />

  • ValidOn

就是它用来指定自定义特性类只可以放在哪些程序实体前,如自定义Attribute那段的代码中自定义特性就限制只允许在属性中使用。从上图微软对AttributeUsageAttribute定义上我们看到其构造函数只有一个参数,那现在如果我们要限制我们自定义特性只允许在属性和字段上使用,我们应该怎么做呢?它是或”|“运算符来实现的,[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)],顺便我们先来看一下微软对AttributeTargets枚举的定义,这样你或许就能想明白为什么这样可以,如下图:

aaarticlea/png;base64,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" alt="" />

  • Inherited 

         我们可以使用这个属性来控制定制特性的继承规则。它标记了我们的特性能否被继承。

  • AllowMultiple 

这个属性标记了我们的定制特性能否被重复放置在同一个程序实体前多次。

Attribute类

  上面说了如何自定义Attribute类,以及如果使用自定义Attribute类。虽然说特性是写给程序自己看的,但它终归是拿来给人用的,那接下来我们来看看如何在程序中读取它里面的值呢?

我们可以转到Attribute类的定义,从中可以看到其中有名为GetCustomAttribute和GetCustomAttributes的静态方法,我们可以通过这两个静态方法可以读取到自定特性类的实例化对象。

 static void Main(string[] args)
{
foreach (var pi in typeof(SysUserInfo).GetProperties())
{
// ColumnAttribute columnAttr = pi.GetCustomAttributes(false)[0] as ColumnAttribute; //等价于下面的语句
ColumnAttribute columnAttr = Attribute.GetCustomAttribute(pi, typeof(ColumnAttribute)) as ColumnAttribute;
if (columnAttr != null)
{
Console.WriteLine(columnAttr.ColumnName);
}
}
}

  以上是我对Attribute的一个小的总结,如果你觉得我写得哪儿有错误的话,还望不吝指点。

C#基础总结之Attribute的更多相关文章

  1. ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证

    原文:Model Validation 作者:Rachel Appel 翻译:娄宇(Lyrics) 校对:孟帅洋(书缘) 在这篇文章中: 章节: 介绍模型验证 验证 Attribute 模型状态 处理 ...

  2. 前端之JavaScript 03

    window对象 所有浏览器都支持 window 对象.概念上讲.一个html文档对应一个window对象.功能上讲: 控制浏览器窗口的.使用上讲: window对象不需要创建对象,直接使用即可. W ...

  3. ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证【转载】

    http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_2_2-validation.html 介绍模型验证 在一个应用程序将数据存储到数据库之前,这个应 ...

  4. C#基础---Attribute(标签) 和 reflect(反射) 应用二

    以前我有写过一篇有关,打标签和反射的应用,主要用于类中字段的验证.下面是连接 C#基础---Attribute(标签) 和 reflect(反射) 应用. 这个项目迭代发现公司项目里面发现老代码对业务 ...

  5. C#基础系列——Attribute特性使用

    前言:上篇 C#基础系列——反射笔记 总结了下反射得基础用法,这章我们来看看C#的另一个基础技术——特性. 1.什么是特性:就博主的理解,特性就是在类的类名称.属性.方法等上面加一个标记,使这些类.属 ...

  6. C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)

    反射以及Attribute在ORM中的应用 一. 反射什么是反射?简单点吧,反射就是在运行时动态获取对象信息的方法,比如运行时知道对象有哪些属性,方法,委托等等等等.反射有什么用呢?反射不但让你在运行 ...

  7. C#基础---Attribute(标签) 和 reflect(反射) 应用

    1.Attribute的定义与作用: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Micros ...

  8. C#基础之Attribute

    1.什么是Attribute 特性简单点理解就是为目标元素添加一些附加信息,这些附加信息我们可以在运行期间以反射的方式拿到.目标元素指的是程序集.模块.类.参数.属性等元素,附加信息指的是特性类中的成 ...

  9. 【基础】Attribute的妙用

    一.何为Attribute 下面是微软官方对Attribute的解释: 公共语言运行时允许你添加类似关键字的描述声明,叫做Attributes,它对程序中的元素进行标注,如类型.字段.方法和属性等.A ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之1082迷宫

        题目 解决代码及点评 /************************************************************************/ /* ...

  2. phpcms 列表页中,如何调用其下的所有子栏目(或特定的子栏目)?

    {pc:get sql="select * from phpcms_category where catid in(你的子栏目ID)" return="data" ...

  3. NSDate与时间戳的那点事

    对于项目中常常使用的时间来说,通过时间戳的形式进行数据的操作能带来极大的方便,以下就时间戳的生成和转换通过Demo的形式进行解说 声明一个时间类型的变量: // 获取当前的时间 // 以下的第一个方法 ...

  4. oracle至mysql该指南的数据模式()任意数据源之间的跨导应用

    为了产生的一些资源的库的释放.需要API模块迁移到mysql在,需要引导数据. 试用oracle to mysql工具.当迁移错误不说,如此大量的数据的,有了这样简陋的工具是不太可靠. 意外的发现工具 ...

  5. Visio中添加、移动或删除形状上的连接点的方法

    Visio中添加.移动或删除形状上的连接点的方法 利用Visio画图时,学会使用连接点能使你的画图质量和速度大幅度提高.下面在Visio2010中,以一个例子讲述如何使用连接点. 一. 准备 1. 打 ...

  6. Servlet的学习(一)

    初识Servlet Servlet是一门专门用于开发动态web资源的技术,Sun公司在其API中提供了一个Servlet接口(当然,我们不会去直接实现这个接口,而是去继承其实现类会更好),因此,狭义的 ...

  7. asp.net 检查文件夹和文件是否存在

    原文  asp.net 检查文件夹和文件是否存在 允许 path 参数指定相对或绝对路径信息. 相对路径信息被解释为相对于当前工作目录. 检查该目录是否存在之前,从 path 参数的末尾移除尾随空格. ...

  8. HDU 3584 三维树状数组

    三维树状数组模版.优化不动了. #include <set> #include <map> #include <stack> #include <cmath& ...

  9. 医院API免费接口的公布

    医院通网(http://hospital.yi18.net) 站点上站快两个月了,基本已经稳定,尽管还有非常多小bug,但还是不影响大局.抱着数据开放和共享的理念,医院大全API接口 (http:// ...

  10. [置顶] head first 设计模式之----Observer pattern

    浅谈设计模式之----观察者模式      观察者模式也是我们日常程序编写中碰到比较多的一种设计模式.首先,所谓观察者模式定义就是指:在对象之间定义了一对多的依赖,这样一来,当一个对象的状态发生变化的 ...