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);
}
Также имейте в виду две вещи.
System.Linq
функции должны быть в состоянии очистить эту функцию много.- Вы просматриваете список аргументов каждый раз, когда возникает исключение. Однако показатели ваших параметров никогда не меняются. Таким образом, вы должны быть в состоянии рассчитать индекс параметра комплексного метода один раз (либо в
CompileTimeInitialize()
или жеRuntimeInitialize()
) и повторно использовать этот индекс.