Ну, вы, конечно же, не можете это сделать, не меняя код в любом классе (предполагая, что вы также не хотите менять везде, что вызывает class1.Execute
) - по крайней мере, не без какой-либо глубокой маскировки кода/инструментария. Тем не менее, вы можете довольно легко добавить событие в Class1
:
public class Class1
{
// TODO: Think of a better name :)
public event EventHandler ExecuteCalled = delegate {};
public void Execute()
{
ExecuteCalled(this, EventArgs.Empty);
// Do your normal stuff
}
}
delegate{}
бит просто чтобы убедиться, что всегда есть по крайней мере, не оп зарегистрированный обработчик события - это не означает, что вам не нужно, чтобы проверить недействительность.
Вы бы затем подключить его в письменной форме:
Class1 class1 = new Class1();
Logger logger = new Logger();
class1.ExecuteCalled += (sender, args) => logger.Write(sender.ToString());
(Предполагается, что вы используете C# 3, так что вы имеете лямбда-выражения доступны для вас - дайте мне знать, если это не так).
Если Class1
реализует интерфейс (скажем IFoo
), вы можете захотеть написать реализацию интерфейса, который оборачивает другой реализации, и только регистрирует перед каждым вызовом:
public sealed class LoggingFoo : IFoo
{
private readonly IFoo original;
private readonly IFoo logger;
public LoggingFoo(IFoo original, Logger logger)
{
// TODO: Check arguments for nullity
this.original = original;
this.logger = logger;
}
// Implement IFoo
public void Execute()
{
logger.Write("Calling Execute on {0}", original);
original.Execute();
}
}
Затем просто используйте эту оболочку вокруг «реальной» реализации везде, где вы в настоящее время просто используете реализацию.
что не так с предложением Джейсона? – RCIX
Предложение jasonh о создании метода, который вызывает другие методы. Я искал реализацию методов событий, поскольку я все еще пытаюсь понять, как они работают. Описание Jon работает, и теперь я понимаю, как их реализовать, мне просто нужно понять, как они работают. –
Это по-прежнему кажется большим количеством дополнительной работы, когда метод расширения делает работу лаконично. Я понимаю, если вы хотите использовать его, чтобы узнать, как работают методы событий, но я не думаю, что я буду использовать это в производственном коде, когда метод расширения с 5 строками будет таким же. – jasonh