相信只要是用过.net MVC的开发都用过特性,例如最基础的HttpMethodAttribute特性,用来给接口进行请求方式限定的,等等诸如此类的特性,数不胜数。
那么什么是特性?
特性就是一个类,直接或者间接继承自Attribute。
特性的使用方法有两种:
[Range(0,10)] [Test] ///分开单独使用 public int Hight { set; get; } [Test, Range(0, 10)] ///合并使用,通过逗号分隔 public string Name { set; get; }
attribute的使用规则,一般通过在特性类上使用AttributeUsage特性来进行设置
这个特性有三个属性:
AllowMultiple:是否允许重复使用;
Inherited:是否可以被继承;
构造函数有AttributeTargets类型的参数,主要用来设置特性的使用场景(类、接口、属性、字段……)
特性的使用场景:
1、用来做标记,通过判断类、属性……是否有这个特性,来进行一些业务逻辑上的判断,比如:
具体是通过System.Reflection程序集提供的反射功能来进行特性获取,
譬如判断一个类型是否具有某个特性,使用的是IsDefined方法,
获取一个类的所有特性,使用的是GetCustomAttributes方法,获取的是一个object[],可以通过as进行强转为需要判断的类型;
2、一些预设的特性:
ObsoleteAttribute:可以通过添加这个特性,对类、属性、接口等进行代码过期设置;
ConditionalAttribute:通过在方法上设置这个特性,可以屏蔽掉对该方法的所有调用(不过支持返回值是void的方法,毕竟只有这样才不会有在调用的时候有上下文);
经常看到错误日志里面有很详细的信息,具体到了某某文件多少行哪个方法出错等等,其实微软也提供了对应的特性,支持我们自己查看这些内容:
/// <summary> /// /// </summary> /// <param name="filePath">调用的文件物理路径</param> /// <param name="num">被调用的行</param> /// <param name="name">调用的方法</param> public void Call2(string str, [CallerFilePath] string filePath = "", [CallerLineNumber] int num = 0, [CallerMemberName] string name = "") { }
3、接口的模型绑定属性验证:
可以通过继承ValidationAttribute,并重写IsValid方法即可实现自定义的属性绑定校验。
原文地址:https://www.cnblogs.com/yuchenghao/p/12210708.html