C# Tips – stwórz obiekt mając nazwę klasy
Metoda CreateInstance() klasy Activator pozwala tworzyć obiekty klas m.in. na podstawie podanej nazwy assembly i nazwy klasy. Daje to nowe możliwości jeśli chodzi o tworzenie obiektów np. w systemie pluginów lub budowania swojego systemu Dependency Injection ( :P ).
Jak zawsze przy wpisach z serii C# Tips nie będę się rozwodził nad całą teorią, a pokażę jedynie prosty przykład zastosowania. Polecam samodzielne poszerzenie zasobu informacji, kiedy już będziesz wiedział od czego zacząć i jak coś się nazywa ;)
Mechanizm tworzenia obiektu poprzez poprzez podanie nazwy klasy w postaci tekstu jest jednym z elementów mechanizmu refleksji czyli modyfikowania aplikacji w trakcie jej działania.
Klasa Activator posiada wiele metod pozwalających tworzyć instancje na różne sposoby nawet z przekazaniem parametrów do konstruktora jednak ja tutaj podam najprostszy przykład, czyli utworzenie obiektu z wykorzystaniem konstruktora bezparametrowego.
Załóżmy, że mamy klasę Book, która znajduję się w assembly o nazwie Books:
public class Book { public int Pages { get; set; } public Book() { Pages = 100; } }
Teraz jeśli chcemy utworzyć jej instancję korzystając z metody CreateInstance() możemy to zrobić w następujący sposób:
using System.Runtime.Remoting; //... ObjectHandle handle = Activator.CreateInstance("Books", "Book"); var book = (Book)handle.Unwrap(); Console.WriteLine(book.Pages); //...
Wynikiem działania tego kodu będzie wyświetlenie na ekranie wartości 100, którą przypisał do właściwości Pages bezparametrowy konstruktor. Jako pierwszy parametr metody podajemy pełną nazwę do assembly, drugim parametrem jest nazwa klasy z całym namespace w jakim się znajduje. Obiekt typu ObjectHandle jest swego rodzaju pośrednikiem, który otrzymuje zapakowany nasz docelowy obiekt, a następnie go „odwija” zwracając jako referencję typu object, którą możemy potem rzutować na typ jaki potrzebujemy.
Powyższy przykład może się wydać trochę bez sensu ponieważ i tak potem rzutujemy utworzony obiekt na konkretną klasę więc musimy ją znać w trakcie kompilacji, ale zamiast klasy może znaleźć się tam interfejs, który musi implementować użyta klasa, a wtedy już niedaleko do chociażby wymyślenia jakiegoś systemu pluginów dla naszej aplikacji.
Pokazany fragment jest jednym z najprostszych przykładów użycia tego mechanizmu w programie. Sama metoda CreateInstance() ma wiele postaci i pozwala także tworzyć obiekty z wykorzystaniem np. konstruktora z parametrami. Jednak zachęcam do samodzielnego zapoznania się ze wszystkimi możliwościami. Dla ułatwienia dam jeszcze link do oficjalnej dokumentacji klasy Activator: http://msdn.microsoft.com/en-us/library/System.Activator(v=vs.110).aspx
Leave a Comment