1

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

我遇到了复杂方法参数的问题。

方法签名是:

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

我能够跟踪 int 类型的第一个参数,因此我可以获得参数名称和值。
但是我怎样才能得到作为复杂对象的第二个参数的属性值呢?

提前致谢。朱塞佩。

解决。

找到解决方案。
切面方法是这样的,将目标方法参数写成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);

        :
        :
    }
4

1 回答 1

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())并重新使用该索引。
于 2015-11-03T22:50:37.230 回答