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

本文深入探讨了C#中特性的概念,包括自定义特性类、带数据的特性类、如何获取特性里的数据以及实际应用案例。重点介绍了正则表达式校验Attribute在验证字符串数据时的应用。

 

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 带数据的特性类

展开
折叠 

image

1.3 获取特性里的数据

展开
折叠

image

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 图解特性

QQ图片20140210161040

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值