2009-02-16 7 views

risposta

20
Console.WriteLine(new StackFrame().GetMethod().DeclaringType); 
+4

Come sottolineato da @Jamezor, questo potrebbe essere un incubo nella performance. cheers – systemkern

11

Mentre le risposte StackTrace sono corrette, hanno un sovraccarico. Se si desidera semplicemente la sicurezza contro la modifica del nome, prendere in considerazione typeof(foo).Name. Dato che i metodi statici non possono essere virtuali, di solito dovrebbe andare bene.

+0

Questo è un buon punto. Ovviamente, se controlli il metodo, controlli il nome della classe, quindi tutto è un po 'accademico. –

+0

Tutto ciò che sto usando è registrare un comportamento eccezionale, quindi posso vivere con il sovraccarico dell'utilizzo del metodo Stack Trace poiché l'esecuzione (probabilmente) cesserà dopo questa attività di registrazione. –

+0

questo non funzionerà se il codice viene incollato in un'altra classe e hai dimenticato di avere questo codice –

6

A (più pulito, IMO) alternativa (ancora lento come l'inferno e io rabbrividire se ho visto questo in una base di codice di produzione):

A proposito, se si sta facendo questo per la registrazione alcuni framework di registrazione (come log4net) hanno l'abilità incorporata. E sì, ti avvertono nei documenti che si tratta di un potenziale incubo di prestazioni.

-3

Poiché i metodi statici non possono essere ereditati, il nome della classe sarà noto al momento della scrittura del metodo. Perché non basta hardcode?

+0

possono essere ereditati duramente. Se si desidera chiamare il metodo statico della sottoclasse, si rischia la sfortuna. – systemkern

+1

@systemkern - Scusa, non l'ho capito. Anche se chiami il metodo "through" in una sottoclasse (come 'SubClass.BaseClassStaticMethod();'), il codice IL effettivo sarà come se lo avessi chiamato dalla classe base. È solo uno zucchero di sintassi del compilatore C#.Non c'è modo di _actually_ chiamare un metodo "attraverso una sottoclasse", e quindi in nessun modo dal metodo per scoprire che il codice C# chiamante è stato scritto in questo modo. –

+0

Sì, è vero, MA potrebbe essere esattamente il punto , si potrebbe voler avere un comportamento leggermente diverso se si chiama SubClassAA.BaseClassStaticMethod() che se si chiama SubClassBB.BaseClassStaticMethod(). Questo potrebbe non essere bello ma a volte necessario perché non si ha il pieno controllo della Sottoclasse ... a causa di "ragioni" – systemkern

44

avete tre opzioni per ottenere il tipo (e quindi il nome) di YourClass che lavorano in una funzione statica:

  1. typeof(YourClass) - veloci (0.043 microsecondi)

  2. MethodBase.GetCurrentMethod().DeclaringType - lento (2.3 microsecondi)

  3. new StackFrame().GetMethod().DeclaringType - più lento (17,2 microsecondi)


Se si utilizza typeof(YourClass) non è auspicabile, quindi MethodBase.GetCurrentMethod().DeclaringType è sicuramente l'opzione migliore.

Problemi correlati