postsharp切入機制
postsharp是編譯過程切入,而不是動态上下文。
類中全局變量會被static化,是以不可以作為動态參數傳遞通道
基礎代碼結構
/// <summary>
/// 執行順序:OnEntry-->>OnSuccess-->>OnExit
/// 發生異常:OnException
/// </summary>
[Serializable]
public class XXXAttribute : PostSharp.Aspects.OnMethodBoundaryAspect
{
/// <summary>
/// 構造函數
/// </summary>
public XXXAttribute()
{
}
#region 需要截獲特定參數時的構造函數
private string[] _paramsNames;
/// <summary>
///
/// </summary>
/// <param name="paramsNames">和被标簽函數的參數必須相同順序</param>
public XXXAttribute(params string[] paramsNames)
{
_paramsNames = paramsNames;
}
#endregion
/// <summary>
/// 入口處理
/// </summary>
/// <param name="args"></param>
public override void OnEntry(PostSharp.Aspects.MethodExecutionArgs args)
{
args.FlowBehavior = PostSharp.Aspects.FlowBehavior.Return;
base.OnEntry(args);
}
/// <summary>
/// 成功執行後
/// </summary>
/// <param name="args"></param>
public override void OnSuccess(PostSharp.Aspects.MethodExecutionArgs args)
{
base.OnSuccess(args);
}
/// <summary>
/// 發生異常時的處理
/// </summary>
/// <param name="args"></param>
public override void OnException(PostSharp.Aspects.MethodExecutionArgs args)
{
base.OnException(args);
}
/// <summary>
/// 流程完成退出時
/// </summary>
/// <param name="args"></param>
public override void OnExit(PostSharp.Aspects.MethodExecutionArgs args)
{
base.OnExit(args);
}
/// <summary>
/// 參數截獲
/// 此方法的邏輯決定變參構造函數和被标簽函數的參數必須相同順序
/// </summary>
/// <param name="arguments"></param>
private void CapturePamatersValue(PostSharp.Aspects.Arguments arguments)
{
if (arguments == null) return;
if (_paramsNames == null) return;
for (int i = 0; i < _paramsNames.Length; i++)
{
switch (_paramsNames[i])
{
case "需要截獲參數":
object 變量 = arguments.GetArgument(i);//截獲邏輯處理
break;
default: break;
}
}
}
}
截獲變量時方法調用
[XXX("變量1", "變量2")]
public void 方法(object 變量1, object 變量2) { }