pondělí 27. června 2011

Název aktuální metody a volající metody

Pokud potřebujeme vrátit název aktuální metody (např. pro účely logování), můžeme použít tento kód:
private static string VratNazevAktualniMetody()
{
string nazevMetody = System.Reflection.MethodBase.GetCurrentMethod().Name;
return methodName;
}

Pokud potřebujeme název metody, která volala aktuální metodu, použijeme následující:
using System.Diagnostics;

private static string VratNazevVolajiciMetody()
{
StackTrace stackTrace = new StackTrace();
if (stackTrace.FrameCount > 0)
{
// rámce jsou indexovány od nejzanořenějšího:
// 0 - aktuální rámec - aktuální metoda
// 1 - nadřazený rámec - metoda, která volala aktuální metodu
// atd... stále výše
// to znamená, že tato podmínka je vždy splněna.
string nazevVolajiciho = stackTrace.GetFrame(1).GetMethod().Name;
return nazevVolajiciho;
}
else
{
return string.Empty;
}
}
Zde je na místě si říci, že využíváme reflexi, která je obecně pomalá, a proto bysme měli zvážit, zda nebude lepší použít jiný postup (přímý zápis názvu metody - "natvrdo"). Pokud je tento kód použít pro logování výjimek, je to nejspíš v pohodě, protože zpracování výjimek je samo o sobě pomalé.

Objekt StackTrace ("stopovací zásobník") nám stopuje (trasuje) průchod kódem a znázorňuje jednotlivá zanoření, kdy jedna metoda volá druhou. Je to stejný objekt, který vidíme při zpracování výjimek.

Žádné komentáře:

Okomentovat