PostSharp OnException. Как я могу получить аргументы для сложных параметров

Я написал атрибут OnMethodBoundaryAspect для регистрации исключений методов.

У меня проблемы с параметром сложного метода.

Подпись метода:

TestClass m_tf = new TestClass ();
m_tf.DoWorkInternal (1, новый 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);

        :
        :
    }

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()) и повторно использовать этот индекс.
Другие вопросы по тегам