Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. using System;
  2. using System.Reflection;
  3. using System.Collections;
  4.  
  5. namespace Recetas.Cap03
  6. {
  7.     // Atributo para especificar que un tipo o
  8.     // miembro ha sido verificado/probado:
  9.     public class VerificadoAttribute : Attribute
  10.     {
  11.         public override string ToString()
  12.         {
  13.             return "Probado";
  14.         }
  15.     }
  16.    
  17.     // Atributo aplicable a estructuras y clases.
  18.     // Posee un argumento requerido: nombre del autor.
  19.     // Posee un argumento opcional: versión de la clase o estructuras
  20.     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
  21.     public class AutorAttribute : Attribute
  22.     {
  23.         private string nombre;
  24.         private int version;
  25.         // Atributo opcional (solo-lectura):
  26.         public string Nombre
  27.         {
  28.             get
  29.             {
  30.                 return nombre;
  31.             }
  32.         }
  33.        
  34.         // Atributo requerido (lectura-escritura):
  35.         public int Version
  36.         {
  37.             get
  38.             {
  39.                 return version;
  40.             }
  41.             set
  42.             {
  43.                 version = value;
  44.             }
  45.         }
  46.         // Ctor para inicializar el atributo requerido:
  47.         public AutorAttribute(string nombre)
  48.         {
  49.             this.nombre = nombre;
  50.             version = 0;
  51.         }
  52.         // Sobrescritura de `ToString`:
  53.         public override string ToString()
  54.         {
  55.             string valor = "Autor: " + nombre;
  56.            
  57.             if (version != 0)
  58.             {
  59.                 valor += " Versión: " + version.ToString();
  60.             }
  61.            
  62.             return valor;
  63.         }
  64.     }
  65.    
  66.     // Aplicamos el atributo `AutorAttribute`:
  67.     [AutorAttribute("John Ortiz Ordoñez")]
  68.     public class Cuenta
  69.     {
  70.         private ArrayList ordenes;
  71.    
  72.         // Aplicamos atributo `VerificadoAttribute`:
  73.         [VerificadoAttribute]
  74.         public void AgregarOrden (Orden orden)
  75.         {
  76.             ordenes.Add (orden);
  77.         }
  78.     }
  79.    
  80.     // Aplica dos atributos: `AutorAttribute`, y `VerificadoAttribute`:
  81.     [AutorAttribute("John Ortiz Ordoñez", Version = 3), VerificadoAttribute()]
  82.     public class Orden
  83.     {
  84.         // Implementación...
  85.     }
  86.    
  87.     public sealed class Aplicacion
  88.     {
  89.         public static void Main()
  90.         {
  91.             // Muestra los atributos de la clase `Cuenta`:
  92.             MostrarAtributos (typeof(Cuenta));
  93.            
  94.             // Muestra los miembros con atributo `VerificadoAttribute`:
  95.             foreach (MethodInfo infoMetodo in (typeof (Cuenta)).GetMethods())
  96.             {
  97.                 if (MiembroVerificado (infoMetodo))
  98.                 {
  99.                     Console.WriteLine ("\tEl miembro `{0}` está verificado.", infoMetodo.Name.ToString());
  100.                 }
  101.                 else
  102.                 {
  103.                     Console.WriteLine ("\tEl miembro `{0}` NO está verificado.", infoMetodo.Name.ToString());
  104.                 }
  105.             }
  106.            
  107.             Console.WriteLine ();
  108.            
  109.             // Muestra los atributos para la clase `Orden`:
  110.             MostrarAtributos (typeof(Orden));
  111.            
  112.             // Enumera los atributos de los métodos de la clase `Orden`:
  113.             foreach (MethodInfo infoMetodo in (typeof (Orden)).GetMethods())
  114.             {
  115.                 if (MiembroVerificado (infoMetodo))
  116.                 {
  117.                     Console.WriteLine ("\tEl miembro `{0}` está verificado.", infoMetodo.Name.ToString());
  118.                 }
  119.                 else
  120.                 {
  121.                     Console.WriteLine ("\tEl miembro `{0}` NO está verificado.", infoMetodo.Name.ToString());
  122.                 }
  123.             }
  124.            
  125.             Console.WriteLine ();
  126.         }
  127.        
  128.         private static bool MiembroVerificado(MemberInfo miembro)
  129.         {
  130.             foreach (object atributo in miembro.GetCustomAttributes(true))
  131.             {
  132.                 if (atributo is VerificadoAttribute)
  133.                 {
  134.                     return true;
  135.                 }
  136.             }
  137.            
  138.             return false;
  139.         }
  140.        
  141.         private static void MostrarAtributos (MemberInfo miembro)
  142.         {
  143.             Console.WriteLine ("\nConjunto de atributos para: {0}", miembro.Name.ToString());
  144.            
  145.             foreach (object atributo in miembro.GetCustomAttributes(true))
  146.             {
  147.                 Console.WriteLine ("\t{0}", atributo.ToString());
  148.             }
  149.         }
  150.     }
  151. }