Advertisement
Fhernd

ClaseDinamica.cs

Sep 11th, 2014
669
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.99 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Dynamic;
  4.  
  5. namespace Recetas.Cap03
  6. {
  7.     public class ClaseDinamica : DynamicObject
  8.     {
  9.         // Diccionario con los miembros (e.g., propiedades) agregadas
  10.         // y consultadas de manera dinámica:
  11.         private Dictionary<string, object> miembros = new Dictionary<string, object>();
  12.        
  13.         ///<summary>
  14.         /// Retorna el valor del miembro invocado.
  15.         ///</summary>
  16.         ///<param name="binder">Información del objeto que invocó la operación dinámica.</param>
  17.         ///<param name="resultado">Resultado de la operación.</param>
  18.         ///<returns>true si el miembro existe. false, en caso contrario.</returns>
  19.         public override bool TryGetMember(GetMemberBinder binder, out object resultado)
  20.         {
  21.             if (miembros.ContainsKey (binder.Name))
  22.             {
  23.                 resultado = miembros[binder.Name];
  24.                 return true;
  25.             }
  26.             else
  27.             {
  28.                 return base.TryGetMember(binder, out resultado);
  29.             }
  30.         }
  31.        
  32.         ///<summary>
  33.         /// Establece el valor al miembro invocado.
  34.         ///</summary>
  35.         ///<param value="binder">Información del objeto que invocó la operación dinámica.</param>
  36.         ///<param value="valor">Valor a establecer sobre el miembro.</param>
  37.         ///<returns>true.</returns>
  38.         public override bool TrySetMember(SetMemberBinder binder, object valor)
  39.         {
  40.             // Si no contiene la propiedad, la crea (agrega):
  41.             if (!miembros.ContainsKey (binder.Name))
  42.             {
  43.                 miembros.Add (binder.Name, valor);
  44.             }
  45.             else
  46.             {
  47.                 miembros[binder.Name] = valor;
  48.             }
  49.            
  50.             return true;
  51.         }
  52.        
  53.         ///<summary>
  54.         /// Invoca un miembro.
  55.         ///</summary>
  56.         ///<param value="binder">Información acerca de la operación dinámica.</param>
  57.         ///<param value="args">Argumentos del objeto que invoca la operación dinámica.</param>
  58.         ///<param value="resultado">Resultado de la invocación del miembro.</param>
  59.         ///<returns>true.</returns>
  60.         public override bool TryInvokeMember (InvokeMemberBinder binder, object[] args, out object resultado)
  61.         {
  62.             if (miembros.ContainsKey (binder.Name) && miembros[binder.Name] is Delegate)
  63.             {
  64.                 resultado = (miembros[binder.Name] as Delegate).DynamicInvoke(args);
  65.                 return true;
  66.             }
  67.             else
  68.             {
  69.                 return base.TryInvokeMember(binder, args, out resultado);
  70.             }
  71.         }
  72.        
  73.         ///<summary>
  74.         /// Retorna los miembros de esta clase dinámica.
  75.         ///</summary>
  76.         ///<returns>Instancia IEnumerable<string> con los miembros de esta clase dinámica.</returns>
  77.         public override IEnumerable<string> GetDynamicMemberNames()
  78.         {
  79.             return miembros.Keys;
  80.         }
  81.        
  82.         public static void Main()
  83.         {
  84.             // Declaramos un variable de tipo DynamicObject:
  85.             dynamic dyn;
  86.            
  87.             // Encapsulamos una instancia de `ClaseDinamica`:
  88.             dyn = new ClaseDinamica();
  89.            
  90.             // Creamos una propiedad de forma dinámica. La
  91.             // propiedad `Contador` con el valor 10:
  92.             dyn.Contador = 13;
  93.            
  94.             // Creamos un delegado con una expresión lambda:
  95.             var delegadoConAction = new Action<string>(texto => Console.WriteLine (texto));
  96.            
  97.             // Asignamos este delegado como miembro de la instancia de `ClaseDinamica`:
  98.             dyn.EscribirEnConsola = delegadoConAction;
  99.            
  100.             // Invocamos el delegado y le pasamos como argumento de la
  101.             // propiedad dinámica `Contador`:
  102.             dyn.EscribirEnConsola (dyn.Contador.ToString());
  103.         }
  104.     }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement