PostSharp OnException。我怎样才能获得复杂参数的参数

时间:2015-10-14 15:35:50

标签: postsharp onexception

我写了一个OnMethodBoundaryAspect属性来记录方法异常。

我遇到Complex方法参数问题。

方法签名是:

TestClass m_tf = new TestClass();
  m_tf.DoWorkInternal(1,new Prova1(){ProvaP1 = 10,ProvaP2 = 11});

我能够跟踪int类型的第一个参数,所以我可以得到参数名称和值 但是,如何获得作为复杂对象的第二个参数的属性值?

提前致谢。 朱塞佩。

解决。

找到解决方案。
aspect方法是这样的,并以json格式写入目标方法参数:

    public override void OnException(MethodExecutionArgs args)
    {
        base.OnException(args);

        Dictionary<string, object> m_args = new Dictionary<string, object>();

        for (int i = 0; i < args.Arguments.Count(); i++)
        {
            string name = args.Method.GetParameters()[i].Name;
            object obj = args.Arguments.GetArgument(i);

            m_args.Add(name, obj);
        }

        var output = JsonConvert.SerializeObject(m_args);

        :
        :
    }

1 个答案:

答案 0 :(得分:0)

虽然您可以将参数/参数数组转换为字典并且JSON将其序列化,但另一种方法是直接使用该类型找到它。

以下代码应该为您解决问题。

public override void OnException(MethodExecutionArgs args)
{
    Prova1 prova1 = null;

    var parameters = args.Method.GetParameters();
    var arguments = args.Arguments
    for (int i = 0; i < arguments.Count(); i++)
    {
        var param = parameters[i];
        var arg = arguments[i];
        if (param.ParameterType == typeof(Prova1))
        {
            prova1 = arg;
        }
    }

    var output = prova1;

    // Do your magic

    base.OnException(args);
}

另外,请记住两件事。

  1. System.Linq函数应该能够清理掉这个函数。
  2. 每次出现异常时,您都会遍历参数列表。但是,参数的索引永远不会改变。因此,您应该能够计算复杂方法参数的索引一次(在CompileTimeInitialize()RuntimeInitialize()中)并重新使用该索引。