Есть ли какой-либо темный, скрытый способ преобразования всех параметров метода в объект []?
При внедрении интеграции между двумя системами с помощью брокера сообщений я заметил, что большинство методов, открытых брокером, использует множество параметров.
Я хочу простой способ регистрировать каждый вызов брокера с каждым параметром. Что-то вроде:
[WebMethod]
public void CreateAccount(string arg1, int arg2, DateTime arg3, ... ) {
object[] args = GetMethodArgs();
string log = args.Aggregate("", (current, next) => string.Format("{0}{1};", current, next));
Logger.Log("Creating new Account: " + args);
// create account logic
}
Мне интересно, если С# предоставляет что-то, что имитирует GetMethodArgs();
У вас может быть только 2 метода.
[WebMethod]
public void CreateAccount(string arg1, int arg2, DateTime arg3)
{
CreateAccountImpl(arg1, arg2, arg3);
}
protected void CreateAccountImpl(params object[] args)
{
string log = args.Aggregate("", (current, next) => string.Format("{0}{1};", current, next));
Logger.Log("Creating new Account: " + args);
// create account logic
}
PostSharp может захватить это с использованием аспекта границы метода. Вот пример кода, чтобы увидеть его в действии.
public sealed class Program
{
public static void Main()
{
Go("abc", 234);
}
[ParamAspect]
static void Go(string a, int b)
{
}
}
[Serializable]
public class ParamAspect : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
object[] argumentContents = args.Arguments.ToArray();
foreach (var ar in argumentContents)
{
Console.WriteLine(ar);
}
}
}
Вывод:
abc
234
Для ведения журнала/аудита я использовал Castle.DynamicProxy для переноса реализации веб-службы. Все вызовы методов перехватываются и передаются объекту IInterceptor, который имеет доступ к параметрам и возвращаемому значению.