天天看点

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

继续阅读