Latest web development tutorials

# Réflexion C (de réflexion)

des moyens de réflexion peuvent accéder au programme, sa capacité à détecter et modifier leur propre état ou de comportement.

Assemblage contient le module qui contient les types, qui à son tour contient des membres. Réflexion fournit un lot d'objets assemblages, des modules et des types.

Vous pouvez utiliser la réflexion pour créer dynamiquement une instance du type, le type est lié à un objet existant, ou d'obtenir le type d'un objet existant. Vous pouvez ensuite appeler le type d'approche ou d'accéder à ses champs et ses propriétés.

Avantages et inconvénients

avantages:

  • 1, ce qui reflète l'amélioration de la flexibilité des processus et l'évolutivité.
  • 2, réduire le couplage, augmenter la capacité d'adaptation.
  • 3, ce qui permet au programme de créer et contrôler tout type d'objet, sans classe cible codée en dur avant.

Inconvénients:

  • 1, les problèmes de performance: l'utilisation est essentiellement une réflexion expliquant le fonctionnement, lorsque les champs et les méthodes d'accès à beaucoup plus lent que le code direct. Ainsi la réflexion sur la flexibilité de l'application principale et d'un cadre d'évolutivité exigeant, la procédure générale est pas recommandée.
  • 2, l'utilisation des réflexions floues au sein de la logique du programme, les programmeurs veulent voir la logique dans le code source, mais la réflexion de contourner la technologie de code source, ce qui apportera des problèmes de maintenance, et le code de réflexion plus complexe que le code correspondant directement .

Reflex (Réflexion) utilisations

Reflex (Réflexion) aux fins suivantes:

  • Il vous permet de visualiser les propriétés à l'exécution (attribut) information.
  • Elle permet l'examen de la collecte de différents types, ainsi que des exemples de ces types.
  • Elle permet une liaison tardive de méthodes et propriétés (propriété).
  • Il permet la création d'un nouveau type lors de l'exécution, puis l'utilisation de ces types effectuent certaines tâches.

Voir Métadonnées

Nous avons déjà mentionné dans la section ci-dessus, l'utilisation de la réflexion (réflexion) peut afficher les propriétés (attribut) information.

Object classeSystem.Reflection MemberInfodoit être initialisé, pour découvrir les propriétés associées à la classe (attribut). Pour ce faire, vous pouvez définir une classe de l'objet cible, comme suit:

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

Le programme suivant illustre ce point:

using System;

[AttributeUsage (AttributeTargets.All)]
HelpAttribute public class: System.Attribute
{
   Url de chaîne readonly public;

   public string Sujet // Topic est un nommé paramètres (nommés) {
      obtenir
      {
         retourner le sujet;
      }
      ensemble
      {

         topic = valeur;
      }
   }

   publique HelpAttribute (string url) // url est un positionnement (position) paramètre {
      this.Url = url;
   }

   sujet de private string;
}
[HelpAttribute ( "Informations sur la classe MyClass")]
classe MyClass
{
}

AttributeAppl d'espace de noms
{
   Programme de classe
   {
      static void Main (string [] args)
      {
         System.Reflection.MemberInfo info = typeof (MyClass);
         Object [] = attributs info.GetCustomAttributes (true);
         for (int i = 0; i <attributes.Length; i ++)
         {
            System.Console.WriteLine (attributs [i]);
         }
         Console.ReadKey ();

      }
   }
}

Lorsque le code ci - dessus est compilé et exécuté, il affiche les propriétés personnalisées attachées à une classeMyClasssur:

HelpAttribute

Exemples

Dans cet exemple, nous allons utiliser la propriétéDebugInfocréé dans le dernier chapitre, et utilise la réflexion (réflexion) pour lire les métadonnées de classeRectangle.

using System;
using System.Reflection;
namespace BugFixApplication
{
   // BugFix une propriété personnalisée est affecté à la classe et ses membres [AttributeUsage (AttributeTargets.Class |
   AttributeTargets.Constructor |
   AttributeTargets.Field |
   AttributeTargets.Method |
   AttributeTargets.Property,
   AllowMultiple = true)]

   DebugInfo public class: System.Attribute
   {
      int Bugno privé;
      développeur de private string;
      lastReview private string;
      string message public;

      publique DebugInfo (int bg, string dev, chaîne d)
      {
         this.bugNo = bg;
         this.developer = dev;
         this.lastReview = d;
      }

      public int Bugno
      {
         obtenir
         {
            retour Bugno;
         }
      }
      public string développeur
      {
         obtenir
         {
            retour développeur;
         }
      }
      public string LastReview
      {
         obtenir
         {
            retour lastReview;
         }
      }
      public string message
      {
         obtenir
         {
            retourner un message;
         }
         ensemble
         {
            message = valeur;
         }
      }
   }
   [DebugInfo (45, "Zara Ali", "08/12/2012",
	Message = "Retour incompatibilité de type")]
   [DebugInfo (49, "Nuha Ali", "10/10/2012",
	Message = "variable non utilisé")]
   classe Rectangle
   {
      // Les variables membres protégées longueur double;
      protégée à double largeur;
      Rectangle publique (double l, double w)
      {
         longueur = l;
         width = w;
      }
      [DebugInfo (55, "Zara Ali", "19/10/2012",
	   Message = "Retour incompatibilité de type")]
      à double getArea publique ()
      {
         retour longueur * largeur;
      }
      [DebugInfo (56, "Zara Ali", "19/10/2012")]
      Affichage public void ()
      {
         Console.WriteLine ( "Longueur: {0}", longueur);
         Console.WriteLine ( "Largeur: {0}", largeur);
         Console.WriteLine ( "Zone: {0}", getArea ());
      }
   } // Fin Rectangle de classe  
   
   classe ExecuteRectangle
   {
      static void Main (string [] args)
      {
         Rectangle r = new Rectangle (4.5, 7.5);
         r.Display ();
         Type de type = typeof (Rectangle);
         // Traverse la classe Rectangle attributs foreach (Object attributs type.GetCustomAttributes (false))
         {
            DebugInfo dbi = (DebugInfo) attributs;
            if (null! = dbi)
            {
               Console.WriteLine ( "Bug n °: {0}", dbi.BugNo);
               Console.WriteLine ( "Développeur: {0}", dbi.Developer);
               Console.WriteLine ( "Dernière révision: {0}",
					dbi.LastReview);
               Console.WriteLine ( "Remarques: {0}", dbi.Message);
            }
         }
         
         // La méthode Iterate attributs foreach (MethodInfo m de type.GetMethods ())
         {
            foreach (Attribut un dans m.GetCustomAttributes (true))
            {
               DebugInfo dbi = (DebugInfo) a;
               if (null! = dbi)
               {
                  Console.WriteLine ( "Bug n °: {0}, pour la méthode: {1}",
						dbi.BugNo, m.Name);
                  Console.WriteLine ( "Développeur: {0}", dbi.Developer);
                  Console.WriteLine ( "Dernière révision: {0}",
						dbi.LastReview);
                  Console.WriteLine ( "Remarques: {0}", dbi.Message);
               }
            }
         }
         Console.ReadLine ();
      }
   }
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants:

Longueur: 4.5
Largeur: 7.5
Superficie: 33,75
Bug n °: 49
Développeur: Nuha Ali
Dernière révision: 10/10/2012
Remarques: variables inutilisées
Bug n °: 45
Développeur: Zara Ali
Dernière révision: 08/12/2012
Remarques: Type de retour mismatch
Bug No: 55, pour la méthode: getArea
Développeur: Zara Ali
Dernière révision: 19/10/2012
Remarques: Type de retour mismatch
Bug No: 56, pour la méthode: Affichage
Développeur: Zara Ali
Dernière révision: 19/10/2012
Remarques: