AOP之PostSharp5-LocationInterceptionAspect
2011-12-11 14:50 破狼 阅读(2238) 评论(2) 编辑 收藏 举报这节我们要讨论的是PostSharp的LocationInterceptionAspect,PostSharp官方把Property和Field成为Location。所以LocationInterceptionAspect就是为了实现Property和Field的拦截。在我们前面讨论了关于方法OnMethodBoundaryAspect的aspect,我们很容易想到,在c#中Property就是一个编译时分为Get和Set两个方法,对于property的aspect就类似于了我们的Method的aspect。而对于Field的aspect同样可以转换为对Property的aspect。
下面我们用反编译工具来证实一下我的说法.
代码:
private string TestField;
编译后:
我们在来看看LocationInterceptionAspect定义:
其OnGetvalue和OnSetValue是我们主要拦截的方法,起参数LocationInterceptionArgs定义:
同样给也拥有来自父类AdviceArgs的Instance对象,对于对象级Location为所在对象,静态则为null;
LocationInterceptionAspect的使用方法和我们的OnMethodBoundaryAspect和类似,使用方式也一样,对于使用对不重要,鄙人觉得更重要的是我们的设计思想。
我暂时能想到的很好的LocationInterceptionAspect使用场景则是LazyLoad,对于3.5表达式的出现,我们到处都可以简单这个词,在c#类库中也加入了这个类。
这里我们只是做一个简单的演示demo,根据attribute上制定的类型的方法延时加载对象,废话不说了上code:

public class LazyLoadAttribute : LocationInterceptionAspect
{
public string MethodName
{
get;
private set;
}
public string PrivoderFullName
{
get;
private set;
}
public LazyLoadAttribute(string MethodName, string PrivoderFullName)
{
Green.Utility.Guard.ArgumentNotNullOrEmpty(MethodName, "MethodName");
Green.Utility.Guard.ArgumentNotNullOrEmpty(PrivoderFullName, "PrivoderFullName");
this.MethodName = MethodName;
this.PrivoderFullName = PrivoderFullName;
}
public override void OnGetValue(LocationInterceptionArgs args)
{
if (args.GetCurrentValue() == null)
{
Console.WriteLine("Loading....");
var value = this.LoadProperty(args.Instance);
if (value != null)
{
args.Value = value;
args.ProceedSetValue();
}
}
args.ProceedGetValue();
}
private object LoadProperty(object p)
{
var type = Type.GetType(this.PrivoderFullName);//具体加载程序集需要自定义需求,这里仅为了测试简化。
if (type != null)
{
var method = type.GetMethod(this.MethodName);
if (method != null)
{
object[] ps = null;
if (p != null)
{
ps = new object[] { p };
}
object entity = null;
if (!method.IsStatic)
{
entity = System.Activator.CreateInstance(type);
}
return method.Invoke(entity, ps);
}
}
return null;
}
}

{
static void Main(string[] args)
{
/*
* demo4*/
Student stu = new Student();
stu.ID = 10;
Console.WriteLine(stu.Name);
Console.WriteLine(stu.Name);
Console.WriteLine(Student.TestStaticProperty);
Console.WriteLine(Student.TestStaticProperty);
Console.Read();
}
public static string TextLazyLoadStaticMenthod(Student stu)
{
return "Student" + stu.ID;
}
public string TextLazyLoadInstacnceMenthod(Student stu)
{
return "Student" + stu.ID;
}
public string TextLazyLoadStaticPropertyMenthod()
{
return "测试";
}
}
public class Student
{
// [LazyLoad("TextLazyLoadStaticMenthod", "PostSharpDemo.Program,PostSharpDemo")]
[LazyLoad("TextLazyLoadInstacnceMenthod", "PostSharpDemo.Program,PostSharpDemo")]
public string Name
{ get; set; }
public string Sex
{ get; set; }
[LazyLoad("TextLazyLoadStaticPropertyMenthod", "PostSharpDemo.Program,PostSharpDemo")]
public static string TestStaticProperty
{ get; set; }
public int ID
{ get; set; }
}
附件下载:dmeo
作者:破 狼
出处:http://www.cnblogs.com/whitewolf/
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客、博客园--破狼和51CTO--破狼。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2009-12-11 使用C#获取CPU及硬盘序列号的源代码