Refleksja – manipulacja obiektami

Refleksja, manipulacja obiektami

W poprzedniej części odczytywaliśmy metadane przy pomocy refleksji. Dzisiaj wykorzystamy te dane, ażeby manipulować obiektami, tworzyć instancje oraz zmieniać ich właściwości, czy też wywoływać ich metody. To właśnie dzięki tym mechanizmom możliwa jest implementacja  kontenerów dependency injection  (wykorzystanie możliwości kreacji obiektów), czy też runnery testów (odczyt atrybutów metod oraz ich wywołanie).

Nowa instancja klasy

Do stworzenia obiektu klasy należy wykorzystać klasę Activator. Ma ona kilka przeładowanych metod umożliwiających tworzenie obiektów.

Z wykorzystaniem domyślnego konstruktora

lub  przy wykorzystaniu konstruktora z parametrami

Więcej informacji https://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

Odczyt oraz zapis właściwości

W celu pracy z właściwościami musimy pobrać jej metadane, co najprościej zrobić na podstawie jej nazwy.

Tak pobrane informacje możemy wykorzystać do pobrania lub zapisania wartości.  Do tego celu służą nam 2 metody GetValue oraz SetValue.

Metoda GetValue przyjmuje jako parametr obiekt, z którego wartość ma zostać odczytana, a zwraca nam obiekt, który został odczytany.

Metoda SetValue przyjmuje 2 parametry, pierwszy z nich jak w przypadku GetValue jest obiektem, który chcemy zmodyfikować, a drugi jest naszą nową wartością. Należy zwrócić uwagę na fakt, iż przy pomocy refleksji możemy zmienić również wartości z prywatnym setterem.

Więcej informacji https://msdn.microsoft.com/pl-pl/library/system.reflection.propertyinfo(v=vs.110).aspx

Wywoływanie metod

Ostatnim z elementów jakie chciałbym przedstawić jest wywoływanie metod. Analogicznie do właściwości najpierw musimy określić, która metoda nas interesuje.

Następnie musimy wywołać już metodę przy pomocy Invoke, która za parametry przyjmuje obiekt oraz tablicę obiektów parametrów.

Więcej informacji https://msdn.microsoft.com/pl-pl/library/system.reflection.methodinfo(v=vs.110).aspx

Odczytywanie atrybutów

Ostatnią rzeczą jaką chciałbym poruszyć jest odczytywania atrybutów. Jak dobrze wiemy atrybuty można przypisywać do wielu elementów klasy. Ich odczytanie sprowadza się do wykorzystania metod GetCustomAttributes lub GetCustomAttribute na odpowiedniej klasie z informacjami (System.Type, MethodInfo, PropertyInfo etc.)

Metoda GetCustomAttributes zwraca nam wszystkie powiązane atrybuty, z kolei GetCustomAttribute przyjmuje jako parametr typ interesującego nas atrybutu.

Projekt z przykładami z tego wpisu możesz znaleźć na moim GitHubie https://github.com/Matejkos/BlogProjects/tree/master/ObjectManipulationWithReflection

Dodaj komentarz

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