c#特性attribute:(二)

日志 

初始化 特性类里边构造函数里的属性,带参数不带参数的

 ******特性是编译时是不加到il 中的,是加到metadata中 ,本身对程序运行没有影响,除非我们主动的读取和使用区供反射可以使用.

查找这个类型是否有特性 ,然后通过反射拿到特性.

 

拿到student 的特性的用处

特性能提供 额外的信息,额外的操作,

如何做到有价值的呢?

面向对象是纵向使用,AOP是横向扩展,一纵一横,独步天下

程序里边需要做日志处理,或者程序之前做用户验证 .用第三方 预处理下,会更合理些  

 

把额外逻辑放在一个特性里边, 通过反射获取特性, 预处理

 AOP

每个模块封装成模块,面向对象

必须先验证 用户, 异常处理,日志处理缓存处理    在每个类里边,都写一套, 会很麻烦. 公共的额外逻辑 最合理的方式就是业务逻辑只关心逻辑,不关心  验证用户,异常处理,日志缓存处理,

aop 在不影响业务逻辑的情况下实现 额外逻辑

真正用起预处理 还是有点点绕的. 

比如有些框架 加上特性会产生什么路由功能之类的,  既然这个特性不会编译到il程序运行中,加上这个特性符号, 是框架已经写好了这些特性,每次启动程序时候,会利用反射启用监测有无使用这个特性.如果有,会运行这个特性下相关的方法.执行这个额外的逻辑.

比如页面请求前边route[""]之类的,是在后台已经监测有无这个特性使用,使用的话,运行 相关的构造函数吧,个人理解

比如这个方法

   public static void Manager<T>(T student) where T : Student
        {
            Type type = student.GetType();
         
            //3 通过特性来提供  把额外逻辑放在特性,标记即拥有
            if (type.IsDefined(typeof(OtherOptionAttribute), true))
            {
                OtherOptionAttribute attribute = type.GetCustomAttributes(typeof(OtherOptionAttribute), true)[0] as OtherOptionAttribute;
                attribute.Do();
            }
public class OtherOptionAttribute : Attribute
{
public void Do()
{
Console.WriteLine("学完之后,做一个学习统计记录");
}
}

可以通过反射找到这个otheroption 类 下的do 方法,然后执行

 
 
原文地址:https://www.cnblogs.com/zuochanzi/p/7802736.html