Latest web development tutorials

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: