c#进阶之特性(Attribute)

2021-01-16 21:15

阅读:2347

标签:tom   define   http   合并   反射   场景   ram   range   类型   

相信只要是用过.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的方法,毕竟只有这样才不会有在调用的时候有上下文);

经常看到错误日志里面有很详细的信息,具体到了某某文件多少行哪个方法出错等等,其实微软也提供了对应的特性,支持我们自己查看这些内容:

/// 
        /// 
        /// 
        /// 调用的文件物理路径
        /// 被调用的行
        /// 调用的方法
        public void Call2(string str,
            [CallerFilePath] string filePath = "",
            [CallerLineNumber] int num = 0,
            [CallerMemberName] string name = "")
        {
        }

3、接口的模型绑定属性验证:

 可以通过继承ValidationAttribute,并重写IsValid方法即可实现自定义的属性绑定校验。

c#进阶之特性(Attribute)

标签:tom   define   http   合并   反射   场景   ram   range   类型   

原文地址:https://www.cnblogs.com/yuchenghao/p/12210708.html


评论


亲,登录后才可以留言!