天天看點

PostSharp AOP程式設計:3.PostSharp的LocationInterceptionAspect類基本組成

      在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

繼續閱讀