2009-12-28 12 views
7

Ho una classe in cui all'interno di questa classe c'è un metodo privato e molti metodi pubblici. Questo metodo privato deve essere chiamato ogni volta prima che venga chiamato qualsiasi altro metodo.Chiamare un metodo ogni volta prima che venga chiamato un altro metodo

L'approccio più semplice sarebbe chiamare il metodo in ogni metodo, ma non mi piace questo approccio. C'è un altro modo per raggiungere questo obiettivo?

+2

faresti piace condividere il tuo codice con noi? Questo potrebbe essere un problema di progettazione ... –

+0

Sono d'accordo con @Steve che questo sembra un problema di progettazione. Nella mia esperienza, se qualcosa non sembra giusto o sembra torturare un modo standard di fare qualcosa, allora dovresti rivalutare il tuo design generale perché probabilmente stai introducendo un odore di codice. Per esempio. dovrai sempre ricordare di chiamare questo metodo ogni volta che estendi la tua API, e se dimentichi? Non ci sono avvisi del compilatore, e tu hai un'eccezione Time Bomb in attesa lì. Detto questo, sono anche d'accordo con le risposte che l'AOP potrebbe essere il modo per andare qui. –

risposta

10

Potrebbe essere possibile fare qualcosa qui con AOP, forse tramite PostSharp; ma unlesete avete intenzione di fare questo lotti, direi a favore di mantenerlo semplice e basta aggiungere il codice extra.

Naturalmente, diventa più complessa se è necessario il polimorfismo e hanno bisogno di sostituzioni per ancora chiamare il metodo prima (probabilmente coinvolge un metodo pubblico non virtuale e un metodo virtuale protetta):

public void Foo() { 
    Bar() 
    FooCore(); 
} 
protected virtual void FooCore() {...} // default Foo implementation 
private void Bar() {...} // your special code 
+1

Ahh ... metaprogramming in fase di compilazione in C#. Sarà un giorno meraviglioso quando arriverà. – LBushkin

5

Questo è un tipico caso di aspect oriented programming. Per quanto ne so, non esiste un modo semplice per farlo in .NET (tranne l'utilizzo del miglioramento del codice byte o la creazione di una classe derivata in fase di runtime, nessuno dei due è facile: ci sono librerie che lo fanno, ad esempio spring.net. Non sono sicuro che tu ne abbia davvero bisogno.)

Vorrei provare ad evitare questa situazione a quasi tutti i costi, o chiamare questo metodo se non c'è davvero altro modo.

Problemi correlati