在PostSharp中的MethodInterceptionAspect類是針對整個方法體的截取,繼承于它的特性可以對整個方法體進行控制和日志截 取、異步操作等!這個類裡面有一個主要的函數可以重載以實作包圍整個方法體截取的作用,它是 OnInvoke(MethodInterceptionArgs args)。意義如下:
OnInvoke(MethodInterceptionArgs args):在它的内部可以通過base.OnInvoke(args)來調用我們加特性聲明的方法執行流程,通過這個方法我們可以在方法開始調用前做操作,調用之後做操作。
首先我們編寫一個繼承于MethodInterceptionAspect類的特性,并且重載相關函數如下代碼:
[Serializable]
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
class ExceptionLogAttribute:MethodInterceptionAspect
{
//針對整個方法體進行包圍調用添加日志和截取異常
public override void OnInvoke(MethodInterceptionArgs args)
{
Arguments arguments = args.Arguments;
StringBuilder sb = new StringBuilder();
ParameterInfo[] parameters = args.Method.GetParameters();
for (int i = 0; arguments != null && i < arguments.Count; i++)
{
//進入的參數的值
sb.Append( parameters[i].Name + "=" + arguments[i] + "");
}
try
{
Console.WriteLine("進入{0}函數,參數是:{1}", args.Method.DeclaringType + args.Method.Name, sb.ToString());
base.OnInvoke(args);
Console.WriteLine("退出{0}函數,傳回結果是:{1}",args.Method.DeclaringType+args.Method.Name,args.ReturnValue);
catch(Exception ex)
Console.WriteLine(string.Format("出現異常,此方法異常資訊是:{0}", ex.ToString()));
}
}
其次我們寫兩個方法做對比,一個方法會發生異常,另外一個方法不會發生異常,并為其添加ExceptionLog的特性,在用戶端進行調用對比,如以下代碼所示:
class Program
static void Main(string[] args)
SetData("First");
Console.WriteLine("---------------------------------------------------------------------------");
GetData("Second");
Console.ReadLine();
[ExceptionLog]
public static string SetData(string str)
return "已經設定資料";
public static string GetData(string str)
throw new ArgumentException("擷取資料出現異常,需要處理");
return "已經擷取資料";
<a target="_blank" href="http://blog.51cto.com/attachment/201204/180747494.png"></a>
本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/827102