Использование Delegate для выполнения кода при входе и выходе метода - PullRequest
2 голосов
/ 20 сентября 2011

У меня есть код, который делает очень повторяющиеся вещи, такие как регистрация входа и выхода метода.В промежутке я выполняю бизнес-логику.Есть ли способ, которым я мог бы справиться с этим с делегатом?

Вот то, что я имею до сих пор.Однако, это действительно ограничительно из-за параметров func, которые я должен передать.У кого-нибудь есть идея получше?

        Func<Func<int>, int> logAction = new Func<Func<int>, int>(func =>
        {
            try
            {
                Console.WriteLine("Logging...");
                return func();
            }
            finally
            {
                Console.WriteLine("End Logging...");
            }
        });

Ответы [ 4 ]

5 голосов
/ 20 сентября 2011

Postsharp идеально подходит для этого - это библиотека Aspect Orientated Programming, которая имеет переплетение времени компиляции, поэтому она не влияет на производительность, как переплетение времени выполнения.Это, вероятно, мало что объясняет, если вы новичок в AOP, но в основном это позволит вам объявить ведение журнала по методу, подобному этому:

<Logging> //apply an aspect that will log entrance/exit of method
void MyMethod(params)
{
    //do something that might throw an exception (or not)
}

Например (и исходный код) об использовании postsharp для ведения журналасм http://www.sharpcrafters.com/solutions/logging

0 голосов
/ 20 сентября 2011

Самый простой способ сделать это - обернуть все внутри действия, а затем просто выполнить это в методе

public void log(Action methodToExecute)
{
    try
    {
      Console.WriteLine("Logging...");
      methodToExecute();
    }
    finally
    {
      Console.WriteLine("End Logging...");
    }

}

Затем вызовите его, создавая общее действие для вашей функции

//no return
log(() => yourFunciton(optionalParmeters));

//return to something 
log(() => someVar = yourFunction(optionalParameters));
0 голосов
/ 20 сентября 2011
private void LogAction(string title, Action action)
{
  Logger.Write(string.Format("Entering %0", title));

  action();

  Logger.Write(string.Format("Leaving %0", title));
}

Пример использования без возвращаемого значения:

LogAction("DoSomething", () => DoSomething());

Пример использования с возвращаемым значением:

int intResult = 0;
LogAction("Square", () => intResult = Square(4, 4));
0 голосов
/ 20 сентября 2011

Кажется, что одна из платформ AOP могла бы решить вашу проблему.

...