【问题标题】:PostSharp OnException. How can i get arguments for complex parametersPostSharp OnException。如何获取复杂参数的参数
【发布时间】:2015-10-14 15:35:49
【问题描述】:

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

复杂方法参数有问题。

方法签名是:

TestClass 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);

        :
        :
    }

【问题讨论】:

    标签: postsharp onexception


    【解决方案1】:

    虽然您可以将参数/参数数组转换为字典并 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() 中)并重新使用该索引。

    【讨论】:

    • 也许是 arguments.Count 而不是 arguments.Count()
    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多