using Castle.DynamicProxy; using System; using System.Reflection; using System.Threading.Tasks; namespace Admin.Core.Aop { public class AopHelper { public static async Task ExecuteGenericMethod(Task returnValue, Action callBackAction, Action exceptionAction, Action finallyAction) { try { var result = await returnValue; callBackAction?.Invoke(result); return result; } catch (Exception ex) { exceptionAction?.Invoke(ex); return default; } finally { finallyAction?.Invoke(); } } public static object CallGenericMethod(IInvocation invocation, Action callBackAction, Action exceptionAction, Action finallyAction) { return typeof(AopHelper) .GetMethod("ExecuteGenericMethod", BindingFlags.Public | BindingFlags.Static) .MakeGenericMethod(invocation.Method.ReturnType.GenericTypeArguments[0]) .Invoke(null, new object[] { invocation.ReturnValue, callBackAction, exceptionAction, finallyAction }); } } }