天天看點

postsharp程式設計基礎模型

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) { }
           

繼續閱讀