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