Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés
Esta documentación está archivada y no tiene mantenimiento.

DynamicObject (Clase)

Proporciona una clase base para especificar el comportamiento dinámico en tiempo de ejecución. Esta clase debe heredarse; no pueden crearse instancias de la misma directamente.

Espacio de nombres:  System.Dynamic
Ensamblado:  System.Core (en System.Core.dll)

public class DynamicObject : IDynamicMetaObjectProvider

El tipo DynamicObject expone los siguientes miembros.

  NombreDescripción
Método protegidoDynamicObjectPermite a los tipos derivados inicializar una nueva instancia del tipo DynamicObject.
Arriba

  NombreDescripción
Método públicoEquals(Object)Determina si el objeto Object especificado es igual al objeto Object actual. (Se hereda de Object).
Método protegidoFinalize Permite que un objeto intente liberar recursos y realizar otras operaciones de limpieza antes de ser reclamado por el recolector de basura. (Se hereda de Object).
Método públicoGetDynamicMemberNamesDevuelve la enumeración de todos los nombres de miembro dinámicos.
Método públicoGetHashCodeActúa como función hash para un tipo concreto. (Se hereda de Object).
Método públicoGetMetaObjectProporciona un objeto DynamicMetaObject que envía a los métodos virtuales dinámicos. El objeto se puede encapsular dentro de otro objeto DynamicMetaObject para proporcionar un comportamiento personalizado para acciones individuales. Este método admite la infraestructura de Dynamic Language Runtime para los implementadores de lenguaje y no está pensado para que se use directamente en el código.
Método públicoGetType Obtiene el Type de la instancia actual. (Se hereda de Object).
Método protegidoMemberwiseClone Crea una copia superficial del Object actual. (Se hereda de Object).
Método públicoToString Devuelve una cadena que representa al objeto actual. (Se hereda de Object).
Método públicoTryBinaryOperationProporciona la implementación de operaciones binarias. Las clases derivadas de la clase DynamicObject pueden invalidar este método para especificar un comportamiento dinámico para operaciones como la suma o la multiplicación.
Método públicoTryConvertProporciona la implementación de las operaciones de conversión de tipos. Las clases derivadas de la clase DynamicObject pueden invalidar este método para especificar el comportamiento dinámico de las operaciones que convierten un objeto de un tipo a otro.
Método públicoTryCreateInstanceProporciona la implementación de las operaciones que inicializan una nueva instancia de un objeto dinámico. Este método no está pensado para su uso en C# o Visual Basic.
Método públicoTryDeleteIndexProporciona la implementación de las operaciones que eliminan un objeto por índice. Este método no está pensado para su uso en C# o Visual Basic.
Método públicoTryDeleteMemberProporciona la implementación de las operaciones que eliminan un miembro de objeto. Este método no está pensado para su uso en C# o Visual Basic.
Método públicoTryGetIndexProporciona la implementación de las operaciones que obtienen un valor por índice. Las clases derivadas de la clase DynamicObject pueden invalidar este método para especificar un comportamiento dinámico para las operaciones de indización.
Método públicoTryGetMemberProporciona la implementación de las operaciones que obtienen valores de miembro. Las clases derivadas de la clase DynamicObject pueden invalidar este método para especificar un comportamiento dinámico para operaciones como obtener el valor de una propiedad.
Método públicoTryInvokeProporciona la implementación para las operaciones que invocan un objeto. Las clases derivadas de la clase DynamicObject pueden invalidar este método para especificar un comportamiento dinámico para operaciones como invocar un objeto o un delegado.
Método públicoTryInvokeMemberProporciona la implementación de las operaciones que invocan un miembro. Las clases derivadas de la clase DynamicObject pueden invalidar este método para especificar un comportamiento dinámico para operaciones como llamar a un método.
Método públicoTrySetIndexProporciona la implementación de las operaciones que establecen un valor por índice. Las clases derivadas de la clase DynamicObject pueden invalidar este método para especificar el comportamiento dinámico de las operaciones que tienen acceso a los objetos por un índice especificado.
Método públicoTrySetMemberProporciona la implementación de las operaciones que establecen valores de miembro. Las clases derivadas de la clase DynamicObject pueden invalidar este método para especificar un comportamiento dinámico para operaciones como establecer el valor de una propiedad.
Método públicoTryUnaryOperationProporciona la implementación de operaciones unarias. Las clases derivadas de la clase DynamicObject pueden invalidar este método para especificar el comportamiento dinámico de operaciones como negación, incremento o decremento.
Arriba

La clase DynamicObject le permite definir qué operaciones se pueden realizar en objetos dinámicos y cómo realizar esas operaciones. Por ejemplo, puede definir lo que pasa al intentar obtener o establecer una propiedad de objeto, llamar a un método o realizar operaciones matemáticas estándar como la suma y la multiplicación.

Esta clase puede ser útil si desea crear un protocolo más conveniente para una biblioteca. Por ejemplo, si los usuarios de su biblioteca tienen que utilizar una sintaxis como Scriptobj.SetProperty("Count", 1), puede proporcionar la capacidad de utilizar una sintaxis mucho más fácil, como scriptobj.Count = 1.

No se puede crear directamente una instancia de la clase DynamicObject. Para implementar el comportamiento dinámico, puede heredar de la clase DynamicObject e invalidar los métodos necesarios. Por ejemplo, si solo necesita operaciones para establecer y obtener propiedades, simplemente puede invalidar los métodos TryGetMember y TrySetMember.

En C#, para habilitar el comportamiento dinámico de las instancias de las clases derivadas de la clase DynamicObject, debe utilizar la palabra clave dynamic. Para obtener más información, vea Uso de tipo dinámico (Guía de programación de C#).

En Visual Basic, el enlace en tiempo de ejecución admite las operaciones dinámicas. Para obtener más información, vea Enlace en tiempo de compilación y en tiempo de ejecución (Visual Basic).

En el ejemplo de código siguiente se muestra cómo crear una instancia de una clase que se deriva de la clase DynamicObject.

public class SampleDynamicObject : DynamicObject {}
//...
dynamic sampleObject = new SampleDynamicObject ();

También puede agregar sus propios miembros a clases derivadas de la clase DynamicObject. Si su clase define propiedades y también invalida el método TrySetMember, dynamic language runtime (DLR) utiliza primero el enlazador del lenguaje para buscar una definición estática de una propiedad en la clase. Si no hay ninguna propiedad de ese tipo, DLR llama al método TrySetMember.

La clase DynamicObject implementa la interfaz DLR IDynamicMetaObjectProvider, que permite compartir instancias de la clase DynamicObject entre los lenguajes que admiten el modelo de interoperabilidad de DLR. Por ejemplo, puede crear una instancia de la clase DynamicObject en C# y, a continuación, pasarla a una función IronPython. Para obtener más información, vea Información general acerca de Dynamic Language Runtime y la documentación del sitio web de CodePlex.

NotaNota

Si tiene un escenario simple en el que necesita un objeto que solo puede agregar y quitar miembros en tiempo de ejecución pero no necesita definir operaciones concretas y no tiene miembros estáticos, utilice la clase ExpandoObject.

Si tiene un escenario más avanzado en el que debe definir cómo participan los objetos dinámicos en el protocolo de interoperabilidad, o debe administrar la memoria caché de distribución dinámica rápida DLR, cree su propia implementación de la interfaz IDynamicMetaObjectProvider.

Suponga que desea proporcionar una sintaxis alternativa para tener acceso a los valores de un diccionario, para que en lugar de escribir sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text" en Visual Basic), pueda escribir sampleDictionary.Text = "Sample text". También, puede hacer que esta sintaxis no distinga entre mayúsculas y minúsculas, para que sampleDictionary.Text sea equivalente a sampleDictionary.text.

El ejemplo de código siguiente demuestra la clase DynamicDictionary, que deriva de la clase DynamicObject. La clase DynamicDictionary contiene un objeto del tipo Dictionary<string, object> (Dictionary(Of String, Object) en Visual Basic) para almacenar los pares clave-valor, e invalida los métodos TrySetMember y TryGetMember para admitir la nueva sintaxis. También proporciona una propiedad Count, que muestra cuántas propiedades dinámicas contiene el diccionario.


// The class derived from DynamicObject.
public class DynamicDictionary : DynamicObject
{
    // The inner dictionary.
    Dictionary<string, object> dictionary
        = new Dictionary<string, object>();

    // This property returns the number of elements
    // in the inner dictionary.
    public int Count
    {
        get
        {
            return dictionary.Count;
        }
    }

    // If you try to get a value of a property 
    // not defined in the class, this method is called.
    public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        // Converting the property name to lowercase
        // so that property names become case-insensitive.
        string name = binder.Name.ToLower();

        // If the property name is found in a dictionary,
        // set the result parameter to the property value and return true.
        // Otherwise, return false.
        return dictionary.TryGetValue(name, out result);
    }

    // If you try to set a value of a property that is
    // not defined in the class, this method is called.
    public override bool TrySetMember(
        SetMemberBinder binder, object value)
    {
        // Converting the property name to lowercase
        // so that property names become case-insensitive.
        dictionary[binder.Name.ToLower()] = value;

        // You can always add a value to a dictionary,
        // so this method always returns true.
        return true;
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Creating a dynamic dictionary.
        dynamic person = new DynamicDictionary();

        // Adding new dynamic properties. 
        // The TrySetMember method is called.
        person.FirstName = "Ellen";
        person.LastName = "Adams";

        // Getting values of the dynamic properties.
        // The TryGetMember method is called.
        // Note that property names are case-insensitive.
        Console.WriteLine(person.firstname + " " + person.lastname);

        // Getting the value of the Count property.
        // The TryGetMember is not called, 
        // because the property is defined in the class.
        Console.WriteLine(
            "Number of dynamic properties:" + person.Count);

        // The following statement throws an exception at run time.
        // There is no "address" property,
        // so the TryGetMember method returns false and this causes a
        // RuntimeBinderException.
        // Console.WriteLine(person.address);
    }
}

// This example has the following output:
// Ellen Adams
// Number of dynamic properties: 2


Para obtener más ejemplos, vea Crear contenedores con DynamicObject en el blog de Preguntas más frecuentes sobre C#.

.NET Framework

Compatible con: 4

.NET Framework Client Profile

Compatible con: 4

Windows 7, Windows Vista SP1 o posterior, Windows XP SP3, Windows Server 2008 (no se admite Server Core), Windows Server 2008 R2 (se admite Server Core con SP1 o posterior), Windows Server 2003 SP2

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Todos los miembros static (Shared en Visual Basic) públicos de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.
Mostrar: