Nun, Sie können es sicherlich nicht tun, ohne Code in beiden Klassen zu ändern (vorausgesetzt, Sie wollen auch nicht überall, dass class1.Execute
ruft) - zumindest nicht ohne einige tiefe Code-Weaving/Instrumentierung Magie. Sie können jedoch ziemlich leicht ein Ereignis in Class1
hinzufügen:
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
}
}
Das delegate{}
Bit nur um sicher zu machen, ist, dass es immer mindestens ein no-op-Ereignishandler registriert - es bedeutet, dass Sie nicht zu überprüfen, müssen für Nichtigkeit.
Sie würden dann durch Schreiben Haken:
Class1 class1 = new Class1();
Logger logger = new Logger();
class1.ExecuteCalled += (sender, args) => logger.Write(sender.ToString());
(Dies wird vorausgesetzt, Sie C# 3, so haben Sie Lambda-Ausdrücke für Sie verwenden - lassen Sie mich wissen, wenn das nicht der Fall ist.)
Wenn Class1
eine Schnittstelle implementiert (zB IFoo
), könnten Sie eine Implementierung der Schnittstelle schreiben möchten, die eine andere Implementierung wickelt und protokolliert kurz vor jedem Aufruf:
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();
}
}
Dann verwenden Sie einfach diesen Wrapper um eine "echte" Implementierung, wo immer Sie gerade die Implementierung verwenden.
Was ist falsch mit Jasonhs Vorschlag? – RCIX
Der Vorschlag von jasonh erstellt eine Methode, die die anderen Methoden aufruft. Ich war auf der Suche nach einer Implementierung von Event-Methoden, da ich immer noch versuche zu verstehen, wie sie funktionieren. Jons Beschreibung funktioniert und ich verstehe jetzt, wie man sie implementiert, ich muss jetzt nur verstehen, wie sie funktionieren. –
Es scheint immer noch eine Menge zusätzlicher Arbeit zu sein, wenn eine Erweiterungsmethode den Job prägnant erledigt. Ich verstehe, wenn Sie es verwenden möchten, um zu lernen, wie Ereignismethoden funktionieren, aber ich glaube nicht, dass ich das im Produktionscode verwenden würde, wenn eine 5-Zeilen-Erweiterungsmethode genauso gut funktioniert. – jasonh