在PostSharp中得LocationInterceptionAspect类是针对属性或字段的面向方面截取。继承与它的特性将可以截取初始化属性、设置属性、获取属性等时候的数据,并且可以在这几个过程中针对属性进行附加控制。
这个类里面有三个主要的函数可以重载分别是RuntimeInitialize(LocationInfo locationInfo)、OnSetValue(LocationInterceptionArgs args)、OnGetValue(LocationInterceptionArgs args)。他们分别意义如下:
RuntimeInitialize(LocationInfo locationInfo):初始化包含属性或字段的类的时候运行此函数,增加控制代码,可以截取到运行此属性或字段的类信息,属性类型等信息。
OnSetValue(LocationInterceptionArgs args):设置属性或字段值的时候运行此函数,增加相关设置值时代码,可以获取到此属性值、属性名等相关信息。
OnGetValue(LocationInterceptionArgs args)。获取属性或字段值的时候运行此函数。
首先我们编写一个继承于LocationInterceptionAspect类的特性,并且重载相关函数如下代码:
- [Serializable]
- public class TestAspect : LocationInterceptionAspect
- {
- //当目标类初始化属性的时候运行此函数。
- public override void RuntimeInitialize(LocationInfo locationInfo)
- {
- //打印类名、属性或字段名、字段类型
- string name = locationInfo.DeclaringType.Name + "." +
- locationInfo.Name + " (" + locationInfo.LocationType.Name + ")"; ;
- Console.WriteLine(name);
- Console.WriteLine("A");
- System.Reflection.FieldInfo finfo = locationInfo.FieldInfo;
- }
- //设置属性的时候运行
- public override void OnSetValue(LocationInterceptionArgs args)
- {
- Console.WriteLine(args.LocationName);
- Console.WriteLine("B");
- base.OnSetValue(args);
- }
- //获取属性的时候运行
- public override void OnGetValue(LocationInterceptionArgs args)
- {
- Console.WriteLine("C");
- base.OnGetValue(args);
- }
- }
其次我们编写一个目标类,此类中含有一个属性并且增加这个属性的特性如下代码所示:
- public class People
- {
- [TestAspect]
- public string Name { get; set; }
- }
最后我们在客户端初始化People类并且设置属性和获取属性如下代码:
- class Program
- {
- static void Main(string[] args)
- {
- People p = new People();
- p.Name = "Mike1";
- Console.WriteLine(p.Name);
- Console.ReadLine();
- }
- }
如需源码请点击 PostSharpField.rar 下载,运行效果如下图:
本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827085
