Как отмечалось выше, я не совсем понимаю формулировку вашего вопроса.Тем не менее, базовый сценарий кажется простым: вы хотите в общих чертах украсить поведение неизвестных методов, обрабатывая как методы, которые возвращают значения, так и методы, которые этого не делают.
Всякий раз, когда я сталкиваюсь с этим типом сценария, я обращаюсь к немунаписав один метод-обертку с возвращаемым типом void
, а затем адаптируя через лямбду второй метод-обертку.Например:
T Wrapper<T>(Func<T> func)
{
T result = default(T);
Wrapper(() => { result = func(); });
return result;
}
void Wrapper(Action action)
{
Console.WriteLine("Wrap start");
action();
Console.WriteLine("Wrap end");
}
Таким образом, мне нужно написать логику оболочки только один раз.В версии Func<T>
есть некоторые издержки, связанные с созданием нового экземпляра делегата и захватом локальной переменной, но, по крайней мере, когда мне приходилось делать подобные вещи, логика обертки и обернутая логика достаточно сложны, чтобы накладные расходылямбда несущественна.