c#特性attribute:(二)

时间:2023-03-09 19:34:35
c#特性attribute:(二)

日志

c#特性attribute:(二)

c#特性attribute:(二)

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

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

c#特性attribute:(二)

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

c#特性attribute:(二)

c#特性attribute:(二)

拿到student 的特性的用处

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

如何做到有价值的呢?

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

c#特性attribute:(二)

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

c#特性attribute:(二)

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

c#特性attribute:(二)

AOP

c#特性attribute:(二)

c#特性attribute:(二)

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

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

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)[] as OtherOptionAttribute;
attribute.Do();
}
public class OtherOptionAttribute : Attribute
{
public void Do()
{
Console.WriteLine("学完之后,做一个学习统计记录");
}
}

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