Latest web development tutorials

C # riflessione (riflessione)

mezzi di riflessione possono accedere al programma, la sua capacità di rilevare e modificare il proprio stato o di comportamento.

Assembly contiene il modulo, che contiene tipi, che a sua volta contiene membri. Riflessione fornisce un pacchetto di oggetti assemblati, moduli e tipi.

È possibile utilizzare la reflection per creare dinamicamente un'istanza del tipo, il tipo è associata a un oggetto esistente, o di ottenere il tipo da un oggetto esistente. È quindi possibile chiamare il tipo di approccio o di accedere ai suoi campi e proprietà.

Pro e contro

vantaggi:

  • 1, che riflette una maggiore flessibilità dei processi e la scalabilità.
  • 2, ridurre l'accoppiamento, aumentare la capacità di adattamento.
  • 3, che consente al programma di creare e controllare qualsiasi tipo di oggetto, senza preventiva classe obiettivo hard-coded.

svantaggi:

  • 1, problemi di prestazioni: utilizzo è essenzialmente una riflessione spiegare il funzionamento, quando i campi e metodi di accesso ai molto più lento rispetto al codice diretto. Così la riflessione sulla flessibilità di applicazione principale e il quadro scalabilità esigente, la procedura generale non è raccomandata.
  • 2, l'uso di riflessioni sfocate all'interno della logica di programma, programmatori vogliono vedere la logica nel codice sorgente, ma riflessione bypassare la tecnologia codice sorgente, che porterà problemi di manutenzione, e il codice riflessione più complesso rispetto al corrispondente codice direttamente .

Reflex (riflessione) usi

Reflex (Reflection) per le seguenti finalità:

  • Esso consente di visualizzare le proprietà in fase di esecuzione (attributi) informazioni.
  • Permette rivedere la raccolta di vari tipi, come pure esempi di questi tipi.
  • Permette l'associazione tardiva di metodi e proprietà (proprietà).
  • Esso permette la creazione di un nuovo tipo in fase di esecuzione, e quindi utilizzando questi tipi di eseguire alcune operazioni.

Visualizzare i metadati

Abbiamo già accennato nel paragrafo precedente, l'uso di riflessione (riflessione) può visualizzare le proprietà (attributi) informazioni.

Oggetto classeSystem.Reflection MemberInfodeve essere inizializzato, per scoprire le proprietà associate con la classe (attributi). Per fare questo, è possibile definire una classe oggetto di destinazione, come segue:

System.Reflection.MemberInfo info = typeof (MyClass);

Il seguente programma illustra questo punto:

using System;

[AttributeUsage (AttributeTargets.All)]
Classe HelpAttribute pubblico: System.Attribute
{
   pubblico in sola lettura stringa URL;

   public string Topic // topic è un nome (nome) parametri {
      ottenere
      {
         tornare argomento;
      }
      set
      {

         topic = value;
      }
   }

   pubblico HelpAttribute (stringa URL) // URL è un posizionamento (posizionale) parametro {
      this.Url = url;
   }

   argomento private string;
}
[HelpAttribute ( "Informazioni sulla classe MyClass")]
class MyClass
{
}

AttributeAppl namespace
{
   Programma di classe
   {
      static void Main (string [] args)
      {
         System.Reflection.MemberInfo info = typeof (MyClass);
         object [] attributi = info.GetCustomAttributes (true);
         for (int i = 0; i <attributes.Length; i ++)
         {
            System.Console.WriteLine (attributi [i]);
         }
         Console.ReadKey ();

      }
   }
}

Quando il codice di cui sopra è compilato ed eseguito, mostrerà le proprietà personalizzate collegati a una classeMyClass:

HelpAttribute

Esempi

In questo esempio, useremo proprietàdebuginfocreato nel capitolo precedente, e utilizza la riflessione (Reflection) per leggere i metadati classeRectangle.

using System;
using System.Reflection;
namespace BugFixApplication
{
   // BugFix una proprietà personalizzata viene assegnato alla classe e ai suoi membri [AttributeUsage (AttributeTargets.Class |
   AttributeTargets.Constructor |
   AttributeTargets.Field |
   AttributeTargets.Method |
   AttributeTargets.Property,
   AllowMultiple = true)]

   Classe debuginfo pubblico: System.Attribute
   {
      private int Bugno;
      sviluppatore private string;
      stringa lastReview privato;
      messaggio public string;

      pubblico debuginfo (int bg, stringa dev, stringa d)
      {
         this.bugNo = bg;
         this.developer = dev;
         this.lastReview = d;
      }

      public int Bugno
      {
         ottenere
         {
            tornare Bugno;
         }
      }
      public string Developer
      {
         ottenere
         {
            tornare sviluppatore;
         }
      }
      public string LastReview
      {
         ottenere
         {
            tornare lastReview;
         }
      }
      public string Messaggio
      {
         ottenere
         {
            tornare messaggio;
         }
         set
         {
            messaggio = valore;
         }
      }
   }
   [Debuginfo (45, "Zara Ali", "2012/12/08",
	Messaggio = "Return tipo non corrispondente")]
   [Debuginfo (49, "Nuha Ali", "10/10/2012",
	Messaggio = "variabile inutilizzata»)]
   classe Rectangle
   {
      // Variabili membro protetto lunghezza doppia;
      protetta larghezza doppia;
      Rettangolo pubblico (doppia L, doppia w)
      {
         lunghezza = l;
         width = w;
      }
      [Debuginfo (55, "Zara Ali", "19/10/2012",
	   Messaggio = "Return tipo non corrispondente")]
      doppia getArea pubblico ()
      {
         tornare lunghezza larghezza *;
      }
      [Debuginfo (56, "Zara Ali", "19/10/2012")]
      Mostra public void ()
      {
         Console.WriteLine ( "Lunghezza: {0}", di lunghezza);
         Console.WriteLine ( "Larghezza: {0}", di larghezza);
         Console.WriteLine ( "Area: {0}", getArea ());
      }
   } // Classe Rectangle End  
   
   classe ExecuteRectangle
   {
      static void Main (string [] args)
      {
         Rectangle r = new Rectangle (4.5, 7.5);
         r.Display ();
         Tipo type = typeof (Rectangle);
         // Traverse classe Rectangle attributi foreach (attributi degli oggetti in type.GetCustomAttributes (false))
         {
            Debuginfo DBI = (debuginfo) attributi;
            se (null! = DBI)
            {
               Console.WriteLine ( "Bug no: {0}", dbi.BugNo);
               Console.WriteLine ( "Sviluppatore: {0}", dbi.Developer);
               Console.WriteLine ( "Last Inviato: {0}",
					dbi.LastReview);
               Console.WriteLine ( "Osservazioni: {0}", dbi.Message);
            }
         }
         
         // Metodo Iterate attributi foreach (MethodInfo m di type.GetMethods ())
         {
            foreach (attributo A in m.GetCustomAttributes (true))
            {
               Debuginfo DBI = (debuginfo) a;
               se (null! = DBI)
               {
                  Console.WriteLine ( "Bug no: {0}, per Metodo: {1}",
						dbi.BugNo, m.Name);
                  Console.WriteLine ( "Sviluppatore: {0}", dbi.Developer);
                  Console.WriteLine ( "Last Inviato: {0}",
						dbi.LastReview);
                  Console.WriteLine ( "Osservazioni: {0}", dbi.Message);
               }
            }
         }
         Console.ReadLine ();
      }
   }
}

Quando il codice di cui sopra è compilato ed eseguito, produce i seguenti risultati:

Lunghezza: 4,5
Larghezza: 7.5
Area: 33.75
Bug No: 49
Developer: Nuha Ali
Ultimo Inviato: 10/10/2012
Note: variabile inutilizzato
Bug No: 45
Developer: Zara Ali
Ultimo Inviato: 2012/12/08
Osservazioni: Tipo di ritorno non corrispondente
Bug No: 55, per il metodo: getArea
Developer: Zara Ali
Ultimo Inviato: 19/10/2012
Osservazioni: Tipo di ritorno non corrispondente
Bug No: 56, per il metodo: Visualizzazione
Developer: Zara Ali
Ultimo Inviato: 19/10/2012
Osservazioni: