在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();
<a target="_blank" href="http://blog.51cto.com/attachment/201204/174739496.jpg"></a>
本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/827085