添加AspectAttribute切面類,實現對核心方法的輸入參數修改。須要注意的是postsharp提供的幾種切面類型都是繼承自Attribute基類,並且是經過對要實現攔截的類或方法添加特性的方式實現切面思想的。因此咱們的切面類 須要按照約定以xxxAttribute的格式命名。編程
[Serializable]
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class AspectAttribute : OnMethodBoundaryAspect { //方法進入時 public override void OnEntry(MethodExecutionArgs args) { //修改輸入參數 args.Arguments[0] = "jingdong"; //設置方法是否繼續執行或退出,若設置的是FlowBehavior.Return方法會直接退出,不執行後續的全部代碼。 args.FlowBehavior = FlowBehavior.Continue; } //方法離開時 public override void OnExit(MethodExecutionArgs args) { Console.WriteLine("exit"); } //方法成功執行時 public override void OnSuccess(MethodExecutionArgs args) { Console.WriteLine("success"); } }
在program中添加咱們的核心方法Start,打印輸入參數。在須要實現攔截的方法添加上一個步驟中實現的切面類特性緩存
public class Program { static void Main(string[] args) { var arg = "tmall"; Console.WriteLine($"original argument:{arg}"); Start(ref arg); Console.Read(); } [Aspect] static void Start(ref string arg) { Console.WriteLine($"real argument:{arg}"); Thread.Sleep(1000); Console.WriteLine("finished"); } }
能夠看到start方法被加入了若干行代碼。安全