Получение параметров метода как объекта [] в C #

1

Есть ли какой-либо темный, скрытый способ преобразования всех параметров метода в объект []?

При внедрении интеграции между двумя системами с помощью брокера сообщений я заметил, что большинство методов, открытых брокером, использует множество параметров.

Я хочу простой способ регистрировать каждый вызов брокера с каждым параметром. Что-то вроде:

[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();

Теги:
log4net

3 ответа

2
Лучший ответ

У вас может быть только 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
}
  • 0
    Затем вы должны знать положение и тип аргументов для остальной части логики создания учетной записи.
  • 0
    Я адаптировал ваше решение для достижения чего-то более общего. CreateAccountImpl был переименован в LogMessage. Затем он получает объект params [] args и log. Логика создания учетной записи останется в методе создания учетной записи сразу после вызова LogMessage.
1

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
  • 0
    PostSharp выглядит как лучший вариант, но, похоже, есть некоторые проблемы с совместимостью с .net Framework 3.5
  • 0
    @Daniel: я использую PostSharp с .NET 3.5 без каких-либо проблем. Я знаю, что они внесли существенные изменения в свое приложение год или два назад, поэтому возможно, что у старых версий могут возникнуть проблемы - но если вы будете придерживаться текущих версий, я ожидаю, что у вас все будет хорошо.
Показать ещё 3 комментария
0

Для ведения журнала/аудита я использовал Castle.DynamicProxy для переноса реализации веб-службы. Все вызовы методов перехватываются и передаются объекту IInterceptor, который имеет доступ к параметрам и возвращаемому значению.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню