Los objetos dinámicos exponen miembros, como propiedades y métodos, en tiempo de ejecución, en lugar de en tiempo de compilación.Esto permite crear objetos para trabajar con estructuras que no coinciden con un tipo o formato estático.Por ejemplo, puede utilizar un objeto dinámico para hacer referencia al Modelo de objeto del documento HTML (DOM), que puede contener cualquier combinación de elementos y atributos HTML válidos.Dado que cada documento HTML es único, se determinan los miembros del documento en tiempo de ejecución. Un método habitual de hacer referencia a un atributo de un elemento XHTML consiste en pasar el nombre del atributo al método GetProperty del elemento.Para hacer referencia al atributo id del elemento HTML <div id="Div1">, primero hay que obtener una referencia al elemento <div> y, a continuación, utilizar divElement.GetProperty("id"). Si utiliza un objeto dinámico, puede hacer referencia al atributo id como divElement.id.

Los objetos dinámicos también proporcionan acceso más cómodo a los lenguajes dinámicos, como IronPython e IronRuby.Puede usar un objeto dinámico para hacer referencia a un script dinámico que se interpreta en tiempo de ejecución.

Para hacer referencia a un objeto dinámico se puede usar el enlace en tiempo de ejecución. En C#, se especifica el tipo de un objeto enlazado en tiempo de ejecución como dynamic. En Visual Basic, se especifica el tipo de un objeto enlazado en tiempo de ejecución como Object.

El compilador de Visual Basic lleva a cabo un proceso denominado enlace (binding) cuando se asigna un objeto a una variable de objeto. Un objeto es de enlace en tiempo de compilación cuando se asigna a una variable que se declara de un tipo de objeto específico. Los objetos de enlace en tiempo de compilación permiten al compilador asignar memoria y realizar otras optimizaciones antes de que se ejecute la aplicación.Por ejemplo, en el siguiente fragmento de código se declara que una variable es de tipo StringBuilder:

Código VB:

' Creamos una variable para poseer un nuevo StringBuilder.
Dim miStrBuilder As System.Text.StringBuilder
' Asignamos un nuevo StringBuilder a la variable.
miStrBuilder = New System.Text.StringBuilder("Hola Mundo")

Código C#:

// Creamos una variable para poseer un nuevo StringBuilder.
System.Text.StringBuilder miStrBuilder;
// Asignamos un nuevo StringBuilder a la variable.
miStrBuilder = new System.Text.StringBuilder("Hola Mundo");

Como StringBuilder es un tipo de objeto específico, la instancia asignada a miStrBuilder es de enlace en tiempo de compilación. Por el contrario, un objeto es de enlace en tiempo de ejecución cuando se asigna a una variable que se declara de tipo Object. Los objetos de este tipo pueden contener referencias a cualquier objeto, pero carecen de muchas de las ventajas de los objetos de enlace en tiempo de compilación. Por ejemplo, en el siguiente fragmento de código se declara una variable de objeto para contener un objeto devuelto por la función CreateObject. Para usar este ejemplo, debe tener Microsoft Excel instalado en su computadora y debe compilar con Option Strict Off para permitir enlaze en tiempo de ejecución (late binding).

Código VB:

Option Strict Off
Module Module1
    Sub Main()
        TestLateBinding()
    End Sub

    Sub TestLateBinding()
        Dim xlApp As Object
        Dim xlBook As Object
        Dim xlSheet As Object
        xlApp = CreateObject("Excel.Application")
        ' Enlaza en tiempo de ejecución con una instancia de un
        ' libro de Excel.
        xlBook = xlApp.Workbooks.Add
        ' Enlaza en tiempo de ejecución con una instancia de una
        ' hoja de Excel.
        xlSheet = xlBook.Worksheets(1)
        xlSheet.Activate()
        ' Muestra la aplicación.
        xlSheet.Application.Visible = True
        ' Ubica algún texto en la celda B2 de la hoja.
        xlSheet.Cells(2, 2) = "Esta es la columna B fila 2"
    End Sub
End Module

Código en C#: (Recuerde hacer una referencia al assembly Microsoft.VisualBasic)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualBasic;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            TestLateBinding();
        }

        public static void TestLateBinding()
        {
            dynamic xlApp = null;
            dynamic xlBook = null;
            dynamic xlSheet = null;
            xlApp = Interaction.CreateObject("Excel.Application");
            // Enlaza en tiempo de ejecución con una instancia de un
            // libro de Excel.
            xlBook = xlApp.Workbooks.Add;
            // Enlaza en tiempo de ejecución con una instancia de una
            // hoja de Excel.
            xlSheet = xlBook.Worksheets(1);
            xlSheet.Activate();
            // Muestra la aplicación.
            xlSheet.Application.Visible = true;
            // Ubica algún texto en la celda B2 de la hoja.
            xlSheet.Cells[2, 2] = "Esta es la columna B fila 2";
        }
  }
}
Siempre que sea posible, utilice objetos de enlace en tiempo de compilación, puesto que permiten al compilador realizar importantes optimizaciones que producen aplicaciones más eficientes. Los objetos de enlace en tiempo de compilación son bastante más rápidos y también facilitan la lectura y el mantenimiento del código, ya que declaran exactamente qué clase de objetos se están utilizando. Otra ventaja del enlace en tiempo de compilación consiste en que permite el uso de características útiles como la finalización automática de código y la Ayuda dinámica, puesto que el entorno de desarrollo integrado (IDE) de Visual Studio puede determinar exactamente el tipo de objeto con el que se está trabajando mientras se edita el código. El enlace en tiempo de compilación reduce el número y la gravedad de los errores en tiempo de ejecución al permitir que el compilador notifique los errores cuando se compila un programa. El enlace en tiempo de ejecución sólo puede utilizarse para obtener acceso a miembros de tipo declarados como Public. Tener acceso a miembros declarados como Friend o Protected Friend produce un error en tiempo de ejecución.


Puede crear objetos dinámicos personalizados utilizando las clases del espacio de nombres System.Dynamic. Por ejemplo, puede crear un ExpandoObject y especificar los miembros de ese objeto en tiempo de ejecución. También puede crear un tipo que herede la clase DynamicObject. Después puede reemplazar los miembros de la clase DynamicObject para proporcionar la funcionalidad dinámica en tiempo de ejecución. Un excelente uso de los objetos dinámicos, puede verlo en el artículo Métodos Genéricos con operaciones

respag
Panamá - © 2012
Haga su donación para colaborar con La Escuela del Programador

La Escuela del Programador es un sitio web sin anuncios, sin ánimo de lucro, no es un sitio web comercial. Es el sueño de compartir con todos, muchos años de una gran pasión. Si realmente encuentra este sitio útil y lo aprovecha, le pido su generosa y no importa cuán modesta colaboración, simplemente para afrontar los costos de mantener este sitio disponible en internet.
No deseo lucrar con este sitio, ya que lo hago desinteresadamente, sólo le pido que, si puede, aporte (desde un dólar hasta lo que crea que puede dar), para afrontar los costos de dominio y hosting. Muchísimas gracias y ojalá juntos podamos hacer un sitio que sea una buena fuente de aprendizaje de programacíon en español.

Si no se siente en condiciones de colaborar, igualmente será bienvenido al sitio, es libre para todos y será un placer que encuentre mis artículos provechosos, pero si realmente me ayuda con una donación minima, seguramente, colaborará para que La Escuela del Programador se mantenga en la Web y crezca, conviertiendo a este sitio hecho con mucha pasión, dedicación y esfuerzo, en una buena fuente de aprendizaje.

Mis saludos cordiales y gracias por interesarse en mi sitio.

Rubén E. Spagnuolo
respag
Panamá - © 2012