C # refleksji (Reflection)
Środki Odbicie może uzyskać dostęp do programu, jego zdolność do wykrywania i modyfikować własne państwo lub zachowanie.
Zespół zawiera moduł, który zawiera rodzajów, które z kolei zawiera członków. Odbicie zapewnia pakiet obiektów zespołów, modułów i typów.
Można użyć refleksji dynamicznie utworzyć wystąpienie typu, rodzaju jest zobowiązany do istniejącego obiektu lub uzyskać typ z istniejącego obiektu. Następnie można wywołać rodzaj podejścia lub dostępu do swoich pól i właściwości.
Plusy i minusy
Zalety:
- 1, odzwierciedlając lepszą elastyczność procesu i skalowalność.
- 2, zmniejszyć sprzęgła, zwiększenie zdolności adaptacyjne.
- 3, który pozwala na program do tworzenia i kontrolowania dowolnego typu obiektu, bez uprzedniego zakodowanej klasie docelowej.
wady:
- 1, problemy z wydajnością: stosowanie jest w istocie odbiciem wyjaśniający działanie, gdy pola i sposoby dostępu do znacznie wolniej niż kod bezpośredniego. Zatem odbicie na głównej elastyczność i skalowalność aplikacji wymagających ram, ogólna procedura nie jest zalecane.
- 2, stosowanie rozmyte odbicia w obrębie logiki programu; programiści chcą widzieć logikę w kodzie źródłowym, a odbiciem ominąć technologię kodu źródłowego, który przyniesie kwestii konserwacji oraz kod odbicie bardziej złożony niż odpowiedni kod bezpośrednio ,
Reflex (refleksji) korzysta
Reflex (Reflection) do następujących celów:
- To pozwala na przeglądanie właściwości w czasie wykonywania (atrybut) informacji.
- Pozwala to przeglądu zbierania różnych typów, a jako przykłady tych typów.
- Pozwala późne wiązanie metod i właściwości (właściwość).
- Pozwala to na stworzenie nowego typu w czasie wykonywania, a następnie przy użyciu tego rodzaju wykonać kilka zadań.
Zobacz Metadane
Mamy już wspomniano w punkcie powyżej, korzystanie z refleksji (odbicia) można wyświetlić właściwości (atrybutów) informacje.
Obiekt klasySystem.Reflection MemberInfomusi być inicjowane za odkrycie właściwości związane z klasą (atrybut). Aby to zrobić, można zdefiniować klasę obiektu docelowego, w sposób następujący:
System.Reflection.MemberInfo info = typeof (MyClass);
Poniższy program demonstruje tę kwestię:
using System; [AttributeUsage (AttributeTargets.All)] public class HelpAttribute: System.Attribute { publicznych readonly ciąg URL; public string Temat // Wątek jest nazwaną (nazwanych) Parametry { dostać { powrót tematu; } zestaw { topic = value; } } publicznego HelpAttribute (string url) // url jest pozycjonowanie (pozycyjne) Parametr { this.Url = url; } prywatny wątek ciąg; } [HelpAttribute ( "Informacja o MojaKlasa klasy")] class MojaKlasa { } AttributeAppl przestrzeni nazw { Program klasy { static void Main (string [] args) { System.Reflection.MemberInfo info = typeof (MyClass); Object [] = info.GetCustomAttributes atrybuty (true); for (int i = 0; i <attributes.Length; i ++) { System.Console.WriteLine (atrybuty [i]); } Console.ReadKey (); } } }
Jeżeli powyższy kod jest kompilowany i wykonywany, wyświetli właściwości niestandardowych dołączone do klasyMojaKlasana:
HelpAttribute
Przykłady
W tym przykładzie użyjemy właściwościDeBugInfoutworzonego w poprzednim rozdziale, i wykorzystuje odbicia (odbicie) do odczytu metadane klasyRectangle.
using System; stosując System.Reflection; nazw BugFixApplication { // Bugfix właściwość niestandardowa jest przypisany do klasy i jej członków [AttributeUsage (AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo: System.Attribute { private int Bugno; prywatny deweloper ciąg; prywatne lastReview ciąg; Komunikat public string; publicznego DeBugInfo (int bg, ciąg dev, string d) { this.bugNo = bg; this.developer = dev; this.lastReview = d; } public int Bugno { dostać { powrót Bugno; } } public string Twórca { dostać { powrót dewelopera; } } public string LastReview { dostać { powrót lastReview; } } public string Message { dostać { komunikat zwrotny; } zestaw { message = value; } } } [DeBugInfo (45 "Zara Ali", "08.12.2012" Message = "Return typu niedopasowanie")] [DeBugInfo (49 "Nuha Ali", "10.10.2012" Message = "Nieużywane zmienna")] klasy Rectangle { // Zmienne użytkownika chroniony podwójną długość; zabezpieczone podwójną szerokość; Prostokąt publicznych (podwójne l dwukrotnie w) { długość = l; width = w; } [DeBugInfo (55 "Zara Ali", "19/10/2012" Message = "Return typu niedopasowanie")] public double GetArea () { Zwraca długość * szerokość; } [DeBugInfo (56 "Zara Ali", "19/10/2012")] public void Display () { Console.WriteLine ( "Czas trwania: {0}", długość); Console.WriteLine ( "Szerokość: {0}", szerokość); Console.WriteLine ( "Obszar: {0}", GetArea ()); } } // Koniec klasy Rectangle Klasa ExecuteRectangle { static void Main (string [] args) { Prostokąt R = new Rectangle (4,5, 7,5); r.Display (); Type type = typeof (prostokąt); // Traverse klasę Prostokąt atrybuty foreach (atrybutów obiektu w type.GetCustomAttributes (false)) { DeBugInfo dBi = (DeBugInfo) atrybutów; jeśli (null! = dBi) { Console.WriteLine ( "Bug nr: {0}", dbi.BugNo); Console.WriteLine ( "Wywoływacz: {0}", dbi.Developer); Console.WriteLine ( "Ostatni recenzji: {0}", dbi.LastReview); Console.WriteLine ( "Uwagi: {0}", dbi.Message); } } // Metoda Iterate atrybuty foreach (MethodInfo mw type.GetMethods ()) { foreach (przyporządkowują w m.GetCustomAttributes (true)) { DeBugInfo dBi = (DeBugInfo) a; jeśli (null! = dBi) { Console.WriteLine ( "Bug nr: {0}, dla metody: {1}", dbi.BugNo, m.Name); Console.WriteLine ( "Wywoływacz: {0}", dbi.Developer); Console.WriteLine ( "Ostatni recenzji: {0}", dbi.LastReview); Console.WriteLine ( "Uwagi: {0}", dbi.Message); } } } Console.ReadLine (); } } }
Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:
Długość: 4,5 Szerokość: 7,5 Powierzchnia: 33,75 Bug nr: 49 Twórca: Nuha Ali Najnowsza recenzja: 10.10.2012 Uwagi: Niewykorzystane zmiennej Bug nr: 45 Twórca: Zara Ali Najnowsza recenzja: 08.12.2012 Uwagi: Zwraca typ niedopasowanie Bug nr: 55, dla metody: GetArea Twórca: Zara Ali Najnowsza recenzja: 19/10/2012 Uwagi: Zwraca typ niedopasowanie Bug nr: 56, dla metody: Display Twórca: Zara Ali Najnowsza recenzja: 19/10/2012 Uwagi: