C#中利用Attribute实现AOP
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中利用Attribute实现AOP相关的知识,希望对你有一定的参考价值。
参考技术A C#的AOP实现主要是参考了这篇 博客 ,并对实现过程中遇到的问题进行分析和修改)。定义一个AOP上下文特性,用于标注需要支持AOP方法的类,通过 ContextAttribute, IContributeObjectSink 来获取类的上下文环境,这是通过 Attribute 拦截参数和获取返回值的前提。
实现一个继承自 ContextBoundObject 的类,并标注 [AOPContext] 特性,两者配合,使得这个类下的方法可以被成功拦截。需要支持AOP的类,继承这个类即可。
用于标注需要拦截参数的方法,和指出对应的处理函数。
TestMethod1为将被拦截处理的方法,before方法和after方法可抽取到其他类中。
被拦截的类需要继承AOPContext,并且该类中调用的第一个方法会被拦截,如果存在嵌套方法,不会拦截到第二个方法。
目前的实现无法改值参,可以考虑将数值类型封装到model中,传model对象。
C#中Attribute介绍
什么是特性?
MSDN中定义为:公共语言运行时运行添加类似关键字的描述声明,叫做Attribute,它对程序中的元素进行标注,如类型、方法、字段和属性等。attribute和Microsoft.Net Framework文件的元数据保存在一起,可以用来在运行时描述你的代码,或者在程序运行时影响应用程序的行为。
我们简单地总结:定制特性attribute,本质上是一个类,其为目标元素提供关联附加信息,并在运行时以反射的方式来获取附件信息。
什么是属性?
属性是面向对象编程的基本概念,提供了对私有字段的封装,C#中以get和set访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。
特性和属性的区别?
在功能和应用上,二者其实没什么太多模糊的概念交叉,因此也没有必要放在一起比较。
attribute通用规则
1.特性可以应用的目标元素包括:程序集(assemby)、模块(module)、类型(Type)、属性(Property)、事件(Event)、字段(Field)、方法(Method)、参数(param)、返回值(return).
2.特性以[,]形式展示。放在紧挨着元素上
3.attribute实例,是在编译期进行初始化,而不是运行期。
.......
示例如下:
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace _01AttributeTest { class Program { static void Main(string[] args) { Tester t = new Tester(); t.CannotRun(); Type tp=typeof(Tester); MethodInfo mInfo = tp.GetMethod("CannotRun"); TestAttribute myAtt = (TestAttribute)Attribute.GetCustomAttribute(mInfo, typeof(TestAttribute)); //myAtt.RunTest(); Console.Read(); } } public class Tester { [Test("Error here.")] public void CannotRun() { } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true)] public class TestAttribute : System.Attribute { public TestAttribute(string message) { Console.WriteLine(message); } public void RunTest() { Console.WriteLine("TestAttribute here. "); } } }
以上是关于C#中利用Attribute实现AOP的主要内容,如果未能解决你的问题,请参考以下文章
mvc4 利用filters特性来 实现自己的权限验证 之二
C# 如果在继承的栏位(Property)中判断是不是实现某接口的自定义属性(Attribute)的栏位?