Mateusz Stanek

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

C#
1
2
Type classType = typeof(ReflectionClass);
object reflectionClass = Activator.CreateInstance(classType);

lub  przy wykorzystaniu konstruktora z parametrami

C#
1
2
3
Type classType = typeof(ReflectionClass);
object[] arguments = new object[] { "Parameter class" };
object reflectionClass = Activator.CreateInstance(classType, arguments);

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.

C#
1
PropertyInfo property = classType.GetProperty("PropertyName");

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.

C#
1
2
3
4
5
6
7
8
public class ReflectionClass
{
   public string ConstructorFilledProperty { get; private set; }
}
 
PropertyInfo property = classType.GetProperty("ConstructorFilledProperty");
property.SetValue(reflectionClass, "new Value");
string propertyValue = (string)property.GetValue(reflectionClass);

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.

C#
1
MethodInfo someMethod = classType.GetMethod("SomeMethod");

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

C#
1
string string returnedValue = (string)someMethod.Invoke(someClass, new object[0]);

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.

C#
1
2
3
4
MethodInfo someMethod = classType.GetMethod("SomeMethod");
IEnumerable<Attribute> attributes = someMethod.GetCustomAttributes();
PropertyInfo property = classType.GetProperty("ConstructorFilledProperty");
IEnumerable<Attribute> propertyAttributes = property.GetCustomAttributes();

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

Related posts:

  1. Własny Atrybut
  2. Program xsd.exe – pomoc przy pracy
  3. Czytelne testy z FluentAssertions
  4. Typy generyczne
6 lutego 2018 MiroBurn Challange Programowanie
No Comments

Refleksja - odczyt metadanych

Snippet VisualStudio

Dodaj komentarz Anuluj pisanie odpowiedzi

Zobacz

  • Mateusz Stanek o mnie
Mateusz Stanek

Zaprzyjaźnione blogi

SGDev.pl

Ostatnie wpisy

  • Rola Prelegent
  • Elektronika – powrót do starego hobby
  • Badger2040
  • 2023 Tydzień 11
  • 2023 Tydzień 10

Najnowsze komentarze

  • Lukas L - Podsumowanie roku 2022
  • Oktawian Kurzynski - Enumeracja – wartość domyślna
  • Mateusz Stanek - Typy generyczne
  • Ola - Enumeracja – wartość domyślna
  • Typy generyczne w języku C# nie są 'rozwiązywane' w czasie kompilacji - Typy generyczne

Archiwa

  • marzec 2025
  • marzec 2023
  • luty 2023
  • styczeń 2023
  • grudzień 2022
  • marzec 2018
  • luty 2018
  • kwiecień 2017
  • marzec 2017
  • luty 2017

Kategorie

  • Bez kategorii
  • DSP2017
  • Elektronika
  • MiroBurn Challange
  • Narzędzia
  • Podsumowanie
  • Produktywność
  • Programowanie
  • Projekt
  • Prywatne
  • Rok 2023
  • Tips

Ostatnie wpisy

  • Rola Prelegent
  • Elektronika – powrót do starego hobby
  • Badger2040
  • 2023 Tydzień 11
  • 2023 Tydzień 10
Dumnie wspierane przez WordPressa | Motyw: Neblue by NEThemes.
Ta strona korzysta z ciasteczek aby świadczyć usługi na najwyższym poziomie. Dalsze korzystanie ze strony oznacza, że zgadzasz się na ich użycie.Zgoda
Privacy & Cookies Policy

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience.
Necessary
Always Enabled
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Non-necessary
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.
SAVE & ACCEPT