1.特性 定义

Attribute用来对类、属性、方法等标注额外的信息,贴一个标签(附着物)
通俗:给 类 或 类成员 贴一个标签,就像航空部为你的行李贴一个标签一样

注意,特性 是 类 和 类的成员 标签,不是对象的!

官方定义:公共语言运行时允许添加类似关键字的描述声明,叫做Attributes; 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和.Net文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。

我们简单的总结为:定制特性attribute,本质上是一个类,其为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息。具体的特性实现方法,在接下来的讨论中继续深入。

1.1 Attribute 自定义特性类

Attribute就是类,Attribute类名一般都以Attribute结尾

展开
折叠

        //定义 特性类
public class FlyAttribute : Attribute
{
} //使用 自定义特性
[Fly] //或者 [FlyAttribute] 可省略 Attribute
puclic class Dog
{
}

1.2 Attribute 带数据的特性类

展开
折叠


1.3 获取特性里的数据

展开
折叠


1.4 自定义Attribute

Attribute都从System. Attribute类继承,类名一般以Attribute结尾

创建构造函数

标记类的用途—AttributeUsage标记(标记的标记):

AttributeTargets:可以添加到哪些成员上。

AllowMultiple:是否允许在一个成员上标记这个Attribute的多个实例,默认false。标注在Attribute类的类名上方。

展开
折叠

        [AttributeUsage(AttributeTargets.Property)]
public class ValidatorAttribute : Attribute
{
public ValidatorType ValidatorType { get; set; }
public ValidatorAttribute(ValidatorType validatorType)
{
this.ValidatorType = validatorType;
}
} public enum ValidatorType
{
Email, PostCode
} class Person
{
public string Name { get; set; } [Validator(ValidatorType.Email)]
public string Email { get; set; } [Validator(ValidatorType.PostCode)]
public string PostCode { get; set; }
}

1.5 练习:正则表达式校验Attribute

写正则表达式验证器,在属性上根据需要添加RegexValidatorAttribute。这种用法在

ASP.Net MVC中用的非常多

class Customer
{
[RegexValidator(@"^\S+@\S+$")]
public string Email{ get; set; }
[RegexValidator(@"^\d{15}$|^\d{18}$")]
public string IdNumber{ get; set; }
}

编写Validate方法,在Validate方法中会对标记了RegexValidator的属性采用指定的正则表达

式进行数据校验。步骤:

1、开发RegexValidatorAttribute,提供保存正则表达式的Pattern属性,以及一个接受正则表达式的构造函数。用AttributeUsage标记RegexValidatorAttribute只能添加到属性上。

2、 Validate方法中取得obj对应的Type对象,遍历type.GetProperties()所有属性,如果属性是string类型,并且定义了RegexValidator,取得RegexValidator对象,读取对象的Pattern对象多和正则表达式。

3、获得属性的值string value = prop.GetValue(obj, null) as string,用正则表达式进行校验

1.6 图解特性

C#4.0图解教程 - 第24章 反射和特性 – 2.特性的更多相关文章

  1. C#4.0图解教程 - 第24章 反射和特性 - 1.反射

    24.1 元数据和反射 有关程序及类型的数据被成为 元数据.他们保存在程序集中. 程序运行时,可以查看其他程序集或其本身的元数据.一个运行的程序查看本身元数据或其他程序的元数据的行为叫做 反射. 24 ...

  2. 【C#4.0图解教程】笔记(第19章~第25章)

    第19章 泛型 1.泛型概念 泛型提供了一种更准确地使用有一种以上的类型的代码的方式. 泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化. 泛型不是类型,而是类型的模板.   2.声明 ...

  3. 【读书笔记】关于《精通C#(第6版)》与《C#5.0图解教程》中的一点矛盾的地方

    志铭-2020年2月8日 03:32:03 先说明,这是一个旧问题,很久很久以前大家就讨论了, 哈哈哈,而且先声明这是一个很无聊的问题,

  4. C#图解教程 第十一章 枚举

    枚举 枚举 设置底层类型和显式值隐式成员编号 位标志 Flags特性使用位标志的示例 关于枚举的补充 枚举 枚举 枚举是由程序员定义的类型与类或结构一样. 与结构一样,枚举是值类型,因此直接存储它们的 ...

  5. 【C#4.0图解教程】笔记(第9章~第18章)

    第9章 语句 1.标签语句 ①.标签语句由一个标识符后面跟着一个冒号再跟着一条语句组成 ②.标签语句的执行完全如同标签不存在一样,并仅执行冒号后的语句. ③.给语句添加一个标签允许控制从代码的另一部分 ...

  6. 【C#4.0图解教程】笔记(第1章~第8章)

    第1章 C#和.NET框架 1..NET框架的组成 .NET框架由三部分组成(严格来说只有CLR和FCL(框架类库)两部分),如图 执行环境称为:CLR(公共语言运行库),它在运行期管理程序的执行. ...

  7. C#图解教程 第六章 深入理解类

    深入理解类 类成员成员修饰符的顺序实例类成员静态字段从类的外部访问静态成员 静态字段示例静态成员的生存期 静态函数成员其他静态类成员类型成员常量常量与静态量属性 属性声明和访问器属性示例使用属性属性和 ...

  8. C# 图解教程 第五章 方法

    方法的结构方法体内部代码的执行本地变量    类型推断和var关键字    嵌套块中的本地变量本地常量控制流方法调用返回值返回语句和void方法参数    形参    实参值参数引用参数引用类型作为值 ...

  9. C#图解教程 第七章 类和继承

    类和继承 类继承访问继承的成员所有类都派生自object类屏蔽基类的成员基类访问使用基类的引用 虚方法和覆写方法覆写标记为override的方法覆盖其他成员类型 构造函数的执行 构造函数初始化语句类访 ...

随机推荐

  1. leetcode 63. Unique Paths II

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  2. leetcode 100. Same Tree

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  3. 多通道(Multichannel)单通道(singlechannel)图像概念梳理

    在做机器视觉时,常常要将一个多通道图像分离成几个单通道图像或者将几个单通道图像合成一个多通道图像,以方便图像处理,但是.写这篇博客,是为加深对这两个概念的理解,下面会给出部分OpenCV对单通道与多通 ...

  4. (备忘)android清单文件中<meta-data>标签,以及<intent-filter>下的<data>标签及其他标签

    1.metadata可以写在application下也可以写在activity下,作为全局或activity内共享的数据 以键值对形式保存 <meta-data android:name=&qu ...

  5. Wijmo 5 与Breeze 的组合,及与METRONIC 的集成

    1.Wijmo 5  是支持ANGULARJS 的HTML5 控件   http://wijmo.gcpowertools.com.cn/ 官方试用版  C1Wijmo-Eval_5.20151.42 ...

  6. 基于 REST 的 Web 服务:基础

    代表性状态传输(Representational State Transfer,REST)在 Web 领域已经得到了广泛的接受,是基于 SOAP 和 Web 服务描述语言(Web Services D ...

  7. Android之Activity之间跳转

    本人自学Android,想到什么就写点什么.主要是怕忘了,哈哈~请观者不要建议~ 今天写点Android窗口之间的跳转以及自己理解: 1.Android中窗口之间的跳转,就是Activity之间的跳转 ...

  8. linux多线程下载工具mwget

    linux多线程下载工具mwget 经常使用wget进行文件下载,然而wget的处理速度并不如人意.遇到一些国外的站点,经常慢得像蜗牛一般.然而为了解决这个问题,便有了mwget:m表示multi多线 ...

  9. Google Code Jam 2015 R2 C

    题意:给出若干个句子,每个句子包含多个单词.确定第一句是英文,第二句是法文.后面的句子两者都有可能.两个语种会有重复单词. 现在要找出一种分配方法(给每个句子指定其文种),使得既是英文也是法文的单词数 ...

  10. cf219d

    树形dp #include <cstdio> #include <vector> using namespace std; #define D(x) const int INF ...