如何将参数名传递给方面方法

本文关键字:方面 方法 参数 | 更新日期: 2023-09-27 18:05:22

用于下面日志记录的索引和aspect方法。

行动:

[LogAspect]
public ActionResult Index(int projectId)
{
    ...
    return PartialView(model);
}
方面方法:

[Serializable]
public class LogAspect : OnMethodBoundaryAspect
{
    public override void OnExit(MethodExecutionArgs args)
    {
        var parameters = JsonConvert.SerializeObject(args.Arguments.ToList());
        string message = string.Format("Releted method parameters:{0}", parameters);
        Logger.Info(string.Format("Controller:{0}, Action:{1}", args.Method.DeclaringType.FullName, args.Method.ToString()), message);
        base.OnExit(args);
    }
}

我可以得到projectid的值为像[1]一样的整数。但是正如你所猜测的,我正在使用这个方面的方法来记录这些信息,如果没有参数的名称(它被写入数据库),它就没有意义了,所以我想获得像[projectId:1]等参数。

如果我在控制器中使用记录器,这将很容易与反射,但我在aspect方法中执行此过程。

如何将参数名传递给方面方法

Arguments只包含值。但是,在Method中确实有通常的反射接口:

args
  .Method
  .GetParameters()
  .Select((p, i) => new { Name = p.Name, Value = args.Arguments[i] });