Porozmawiajmy o refleksji.

 

Witam wszystkich po krótkiej przerwie.


Dzisiejszym postem chciałbym rozpocząć blok wpisów bardziej zaawansowanych, wzorowanych na moich codziennych zmaganiach z programowaniem.


Cykl wpisów zacznę od Releksji w C#.


Zadajmy sobie pytanie do Czego służy Refleksja i jak poprawnie jej używać?Służy przede wszystkim uzyskania informacji o typie w trakcie wykonywania programu. Klasy, które mają dostęp do metadanych działającego programu są zdefiniowane w przestrzeni nazw

 

Przestrzeń nazw System.Reflection zawiera klasy, które pozwalają na uzyskanie informacji o aplikacji oraz pozwalają na dynamiczne dodawanie typów, wartości i obiektów do aplikacji.
Brzmi Prosto?
Takie proste nie jest, i przyznam się zajęło mi sporo czasu zrozumienie w jaki sposób to działa i jak tego poprawnie użyć.

 

Korzyści z użycia Refleksji

 

Refleksja pozwala nam na:

  • podgląd atrybutów w trakcie wykonywania programu;
  • sprawdzenie różnych typów danych w danej bibliotece oraz utworzenie ich instancji;
  • wykonanie tzw. „późnego wiązania” do metod i właściwości (Czy jest „późne wiązanie” ?Jest niczym innym jak  poszukiwaniem docelowej metody w trakcie wykonywania programu. Wiązanie takie ma zwykle wpływ na wydajność. Poszukiwanie takie wymaga dopasowania w trakcie wykonywania programu, oznacza to, że wywołania metod są wolniejsze. Przeciwieństwem jest wczesne wiązanie, tj. docelowa metoda jest znana już w trakcie kompilacji kodu);
  • tworzenie nowych typów w trakcie wykonywania programu a następnie wykonywanie różnych zadań przy użyciu tych typów.

Wyświetlanie metadanych

Mówiąc o metadanych należy wspomnieć czym są Metadane.

 

Do każdego podzespołu (czyli assembly) kompilator dołącza dodatkowe dane. Obok Manifestu generuje także Metadane, na które składają się tabele definicji i referencji.

Tabele Definicji:
zawierają kompletny opis typów stosowanych w kodzie aplikacji w języku pośrednim MSIL (Microsoft Intermediate Language), tj. definicje typów, pól, metod, właściwości, parametrów.
Tabele Referencji:
zwierają odwołania do typów znajdujących się w innych zestawach.
Metadane potrzebne są kompilatorowi JIT (Just-In-Time) podczas konwertowania kodu IL(Intermediate Language) na rdzenny kod maszynowy danej architektury.

 

Obiekt MemberInfo pochodzący z klasy System.Reflection musi być zainicjowany, aby poznać informację o atrybutach danych klasy. Aby to zrobić należy zdefiniować obiekt klasy docelowej:

 

Przejdźmy może do przykładu na podstawie którego będzie łatwiej nam to zrozumieć:

Instancja klasy

W powyższy przykład demonstrował jak, poprzez refleksje, może uzyskać dostęp do atrybutów i informacji o nich.

W przykładzie poniżej przedstawię sposób utworzenia instancji danej klasy. Pokażę także dostęp do właściwości oraz wywołamy metody tej klasy.
Pamiętam kiedy pierwszy raz musiałem użyć refleksji w pracy podczas dodawania nowych settingów do istniejących które używały refleksji, i była to ciężka przeprawa.

 

Mam nadzieję że temat refleksji będzie dla was bardziej przejrzysty i nie przyprawi o ból głowy tak jak mnie.

Jako standard Kod wrzucony do GitHuba.

Pytania? piszcie chętnie odpowiem. 🙂

Post Author: Csharpowe Zmagania

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.