Moinmoin,
in einer Klasse soll bei bestimmten Methoden (siehe "New", "Save") vor und nach der eigentlichen Funktionalität eine andere Methode PreExecute bzw. PostExecute aufgerufen werden. Im Beispiel sieht man was gemeint ist...
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| class Test
{ void New() { if (!PreExecute("New")) return; PostExevute("New"); } void Save() { if (!PreExecute("Save")) return; PostExevute("Save"); }
bool PreExecute(string methodeName) {
return true; }
void PostExecute(string methodeName) { } } |
Diese erste Variante funktioniert einwandfrei, aber ist recht umständlich, da in jeder Methode auf die richtigen Pre- und Post-Aufrufe eingetragen werden müssen.
Variante zwei ist ein anderer Ansatz...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| class Test { void New() { } void Save() { }
bool PreExecute(string methodeName) {
return true; }
void PostExecute(string methodeName) { }
void Execute(string methodeName) { if (!PreExecute(methodeName)) return; switch (methodeName) { case "New": New(); break; case "Save": Save(); break; } PostExevute(methodeName); } } |
Diese Variante hat den Nachteil, das von aufrufender Stelle immer die Execute-Methode zu verwenden ist. Da die Aufrufe in der Klasse selbst stehen können, wäre somit durch einen direkten Aufruf von "New()", das Pre- und PostExecute zu umgehen.
Gibt es noch eine elegantere Vorgehensweise ?
Idee wäre einfach ein Attribut [PrePostHandling] zu definieren und die Pre- und PostMethode in der Basisklasse würde bei jedem direkten Methode (z.B. "New()") mit diesem Attribut automatisch aufgerufen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| class Test : PrePostHandler { [PrePostHandling] void New() { }
[PrePostHandling] void Save() { } } |
Aber leider funktioniert das so nicht.
Gruß
Norbert
Moderiert von
Christian S.: C#-Tags hinzugefügt