Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Dynamic;
  4.  
  5. namespace Receptas.Cap04
  6. {
  7.     public class DiccionarioDinamico : DynamicObject
  8.     {
  9.         private IDictionary<string, object> dict = new Dictionary<string, object>();
  10.        
  11.         // Propiedad estática:
  12.         public int Contador
  13.         {
  14.             get
  15.             {
  16.                 Console.WriteLine ("Se ha invocado la propiedad `Contador`.");
  17.                 return dict.Count;
  18.             }
  19.         }
  20.        
  21.         public override bool TryGetMember (GetMemberBinder binder, out object result)
  22.         {
  23.             Console.WriteLine ("Solicitud de miembro dinámico: {0}", binder.Name);
  24.             return dict.TryGetValue (binder.Name, out result);
  25.         }
  26.        
  27.         public override bool TrySetMember (SetMemberBinder binder, object value)
  28.         {
  29.             Console.WriteLine ("Solicitud de establecimiento de valor {0} para el miembro {1}",
  30.                 binder.Name, value);
  31.            
  32.             dict[binder.Name] = value;
  33.            
  34.             return true;
  35.         }
  36.     }
  37.    
  38.     public sealed class PruebaDiccionarioDinamico
  39.     {
  40.         public static void Main()
  41.         {
  42.             // Declaración variable dynamic:
  43.             dynamic dynDict;
  44.            
  45.             // Encapsulación de variable de `DiccionarioDinamico` sobre
  46.             // la variable `dynDict`:
  47.             dynDict = new DiccionarioDinamico();
  48.            
  49.             // Creación dinámica de propiedades, y asignación
  50.             // de valores:
  51.             Console.WriteLine ("\nCreación de propiedades y asignación valores:");
  52.             dynDict.PrimerNombre = "John";
  53.             dynDict.Apellido = "Ortiz";
  54.            
  55.             // Recuperación de valores de propiedades:
  56.             Console.WriteLine ("\nObtención de los valores de las propiedades dinámicas:");
  57.             Console.WriteLine ("\tPrimer nombre: {0}", dynDict.PrimerNombre);
  58.             Console.WriteLine ("\tApellido: {0}", dynDict.Apellido);
  59.            
  60.             // Invocación de miembro declarado estáticamente:
  61.             Console.WriteLine ("\nInvocación de miembro declarado estáticamente:");
  62.             Console.WriteLine ("\tContador: {0}", dynDict.Contador.ToString());
  63.            
  64.             // Intento de invocación de una propiedad no existente:
  65.             Console.WriteLine ("\nIntento de invocar propiedad no existente:");
  66.             try
  67.             {
  68.                 Console.WriteLine ("\tCiudad {0}", dynDict.Ciudad);
  69.             }
  70.             catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException e)
  71.             {
  72.                 Console.WriteLine ("\tLa propiedad `Ciudad` no ha sido declarada ni estática ni dinámicamente.");
  73.             }
  74.            
  75.             Console.WriteLine();
  76.         }
  77.     }
  78. }