Получение параметров метода как объекта [] в C # - PullRequest
1 голос
/ 03 августа 2011

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

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

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

[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
}

Мне любопытно, если C # предоставляет что-то, что имитирует GetMethodArgs ();

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

Вы можете просто использовать 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
}
1 голос
/ 03 августа 2011

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 голосов
/ 03 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...