Backend,  Programowanie

Dostęp do informacji elementu wywołującego, czyli Caller Info – Język C#

Caller Info jest to zestaw atrybutów, dostępnych pod przestrzenią nazw (ang. namespace) System.Runtime.CompilerServices, pozwalających na uzyskanie informacji na temat elementu wywołującego metodę, opatrzoną tymi atrybutami. Metoda wywołująca, której dane pozyskujemy nazywa się z ang. caller. Mechanizm został wprowadzony w wersji 5.0 języka C#.

Caller Informaton pozwala na pobranie informacji o:

  • Nazwie elementu wywołującego (np. nazwie metody), za pomocą atrybutu CallerMemberNameAttribute.
  • Nazwy pliku w którym znajduje się caller, za pomocą atrybutu CallerFilePathAttribute.
  • Numerze linijki w kodzie, gdzie znajduje się element wywołujący, za pomocą atrybutu: CallerLineNumberAttribute.

Utworzymy teraz praktyczny przykład pokazujący jak działają te atrybuty w praktyce. Na początku stworzymy oddzielny plik gdzie będzie znajdowała się metoda korzystająca z atrybutów Caller Info:

public static class CallerClass
{
   public static string CallInfo([CallerMemberName] string callerMemberName = "",
   [CallerFilePath] string callerFilePath = "",
   [CallerLineNumber] int sourceLineNumber = 0)
   {
      return $"{callerMemberName}, {callerFilePath}, {sourceLineNumber}";
   }
}

Teraz dodamy klasę z property, która wykorzystuje powyższą metodę:

static class HelperClass
{
   public static string CallerProperty => CallerClass.CallInfo();
}

Na koniec w pliku z metodą Main wywołamy metodę bezpośrednio oraz za  pomocą property:

class Program
{
   static void Main(string[] args)
   {
      Console.WriteLine(CallerClass.CallInfo());
      Console.WriteLine(HelperClass.CallerProperty);
      Console.Read();
   }
}

Rezultat:

Atrybuty te można używać jedynie jako parametry, a żeby nie podawać ich za każdym razem przy wywołaniu metody są one opatrzone domyślną wartością, która jest w większości przypadków ignorowana. W trakcie kompilacji wywoływania metody zostaje napełniona właściwymi wartościami, zależnymi od elementu, który wywołuje tę metodę.

Nie można zlikwidować wartości domyślnych w taki sposób:

public static class CallerClass
{
   public static string CallInfo([CallerMemberName] string callerMemberName,
   [CallerFilePath] string callerFilePath,
   [CallerLineNumber] int sourceLineNumber)
   {
      return $"{callerMemberName}, {callerFilePath}, {sourceLineNumber}";
   }
}

Ponieważ kompilator zgłosi błąd:

Inne elementy wywołujące:

A co, jeżeli wywołamy metodę z elementu, który się nie nazywa, np. z konstruktora? Wtedy dostaniemy:

Nazwa .ctor związana jest z zwykłym konstruktorem, a .cctor ze statycznym.

Podsumowanie

Korzystanie z atrybutów Caller Information nie jest popularne i nie przyda się przy budowaniu jakichś CRUDowych aplikacji. Pozwala jednak uzyskać dane deweloperskie, co może znaleźć zastosowanie do budowy różnych narzędzi, albo wzbogacić mechanizmy debuggowania Twojego kodu.

Social media & sharing icons powered by UltimatelySocial