Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Clase DynamicObject

 

Publicado: octubre de 2016

Proporciona una clase base para especificar el comportamiento dinámico en tiempo de ejecución. Esta clase se debe heredar; no se puede crear una instancia de la clase directamente.

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


[SerializableAttribute]
public class DynamicObject : IDynamicMetaObjectProvider

NombreDescripción
System_CAPS_protmethodDynamicObject()

Permite derivadas tipos para inicializar una nueva instancia de la DynamicObject tipo.

NombreDescripción
System_CAPS_pubmethodEquals(Object)

Determina si el objeto especificado es igual al objeto actual.(Heredado de Object).

System_CAPS_protmethodFinalize()

Permite que un objeto intente liberar recursos y realizar otras operaciones de limpieza antes de ser reclamado por el recolector de basura. (Heredado de Object).

System_CAPS_pubmethodGetDynamicMemberNames()

Devuelve la enumeración de todos los nombres de miembro dinámico.

System_CAPS_pubmethodGetHashCode()

Sirve como la función hash predeterminada.(Heredado de Object).

System_CAPS_pubmethodGetMetaObject(Expression)

Proporciona un DynamicMetaObject que lo envía a los métodos virtuales dinámicos. El objeto se puede encapsular dentro de otro 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á diseñada para utilizarse directamente desde el código.

System_CAPS_pubmethodGetType()

Obtiene el Type de la instancia actual.(Heredado de Object).

System_CAPS_protmethodMemberwiseClone()

Crea una copia superficial del Object actual.(Heredado de Object).

System_CAPS_pubmethodToString()

Devuelve una cadena que representa al objeto actual. (Heredado de Object).

System_CAPS_pubmethodTryBinaryOperation(BinaryOperationBinder, Object, Object)

Proporciona la implementación de operaciones binarias. Las clases derivadas de la DynamicObject clase puede invalidar este método para especificar un comportamiento dinámico para operaciones como la suma o multiplicación.

System_CAPS_pubmethodTryConvert(ConvertBinder, Object)

Proporciona la implementación para el tipo de operaciones de conversión. Las clases derivadas de la DynamicObject clase puede invalidar este método para especificar un comportamiento dinámico para las operaciones que convierten un objeto de un tipo a otro.

System_CAPS_pubmethodTryCreateInstance(CreateInstanceBinder, Object[], Object)

Proporciona la implementación para las operaciones que inicializar una nueva instancia de un objeto dinámico. Este método no está pensado para su uso en C# o Visual Basic.

System_CAPS_pubmethodTryDeleteIndex(DeleteIndexBinder, Object[])

Proporciona 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.

System_CAPS_pubmethodTryDeleteMember(DeleteMemberBinder)

Proporciona la implementación de las operaciones que eliminan a un miembro de objeto. Este método no está pensado para su uso en C# o Visual Basic.

System_CAPS_pubmethodTryGetIndex(GetIndexBinder, Object[], Object)

Proporciona la implementación de las operaciones que obtienen un valor por índice. Las clases derivadas de la DynamicObject clase puede invalidar este método para especificar un comportamiento dinámico para las operaciones de indización.

System_CAPS_pubmethodTryGetMember(GetMemberBinder, Object)

Proporciona la implementación para las operaciones que obtienen valores de miembro. Las clases derivadas de la DynamicObject clase puede invalidar este método para especificar un comportamiento dinámico para operaciones como obtener un valor para una propiedad.

System_CAPS_pubmethodTryInvoke(InvokeBinder, Object[], Object)

Proporciona la implementación para las operaciones que invocan a un objeto. Las clases derivadas de la DynamicObject clase puede invalidar este método para especificar un comportamiento dinámico para operaciones como invocar un objeto o un delegado.

System_CAPS_pubmethodTryInvokeMember(InvokeMemberBinder, Object[], Object)

Proporciona la implementación de las operaciones que invocan a un miembro. Las clases derivadas de la DynamicObject clase puede invalidar este método para especificar un comportamiento dinámico para operaciones como llamar a un método.

System_CAPS_pubmethodTrySetIndex(SetIndexBinder, Object[], Object)

Proporciona la implementación de las operaciones que establecen un valor por índice. Las clases derivadas de la DynamicObject clase puede invalidar este método para especificar un comportamiento dinámico para las operaciones que tienen acceso a objetos por un índice especificado.

System_CAPS_pubmethodTrySetMember(SetMemberBinder, Object)

Proporciona la implementación de las operaciones que establecen valores de miembro. Las clases derivadas de la DynamicObject clase puede invalidar este método para especificar un comportamiento dinámico para operaciones como establecer un valor para una propiedad.

System_CAPS_pubmethodTryUnaryOperation(UnaryOperationBinder, Object)

Proporciona la implementación para operaciones unarias. Las clases derivadas de la DynamicObject clase puede invalidar este método para especificar un comportamiento dinámico para operaciones como la negación, incremento o decremento.

The DynamicObject class enables you to define which operations can be performed on dynamic objects and how to perform those operations. For example, you can define what happens when you try to get or set an object property, call a method, or perform standard mathematical operations such as addition and multiplication.

This class can be useful if you want to create a more convenient protocol for a library. For example, if users of your library have to use syntax like Scriptobj.SetProperty("Count", 1), you can provide the ability to use much simpler syntax, like scriptobj.Count = 1.

You cannot directly create an instance of the DynamicObject class. To implement the dynamic behavior, you may want to inherit from the DynamicObject class and override necessary methods. For example, if you need only operations for setting and getting properties, you can override just the M:System.Dynamic.DynamicObject.TrySetMember(System.Dynamic.SetMemberBinder,System.Object) and M:System.Dynamic.DynamicObject.TryGetMember(System.Dynamic.GetMemberBinder,System.Object@) methods.

In C#, to enable dynamic behavior for instances of classes derived from the DynamicObject class, you must use the dynamic keyword. For more information, see Using Type Dynamic (C# Programming Guide).

In Visual Basic, dynamic operations are supported by late binding. For more information, see Early and Late Binding.

The following code example demonstrates how to create an instance of a class that is derived from the DynamicObject class.

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

You can also add your own members to classes derived from the DynamicObject class. If your class defines properties and also overrides the M:System.Dynamic.DynamicObject.TrySetMember(System.Dynamic.SetMemberBinder,System.Object) method, the dynamic language runtime (DLR) first uses the language binder to look for a static definition of a property in the class. If there is no such property, the DLR calls the M:System.Dynamic.DynamicObject.TrySetMember(System.Dynamic.SetMemberBinder,System.Object) method.

The DynamicObject class implements the DLR interface T:System.Dynamic.IDynamicMetaObjectProvider, which enables you to share instances of the DynamicObject class between languages that support the DLR interoperability model. For example, you can create an instance of the DynamicObject class in C# and then pass it to an IronPython function. For more information, see Dynamic Language Runtime Overview and documentation on the CodePlexhttp://go.microsoft.com/fwlink/?LinkId=141028 Web site.

System_CAPS_noteNota

If you have a simple scenario in which you need an object that can only add and remove members at run time but that does not need to define specific operations and does not have static members, use the T:System.Dynamic.ExpandoObject class.

If you have a more advanced scenario in which you need to define how dynamic objects participate in the interoperability protocol, or you need to manage DLR fast dynamic dispatch caching, create your own implementation of the T:System.Dynamic.IDynamicMetaObjectProvider interface.

Assume that you want to provide alternative syntax for accessing values in a dictionary, so that instead of writing sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text" in Visual Basic), you can write sampleDictionary.Text = "Sample text". Also, you want this syntax to be case-insensitive, so that sampleDictionary.Text is equivalent to sampleDictionary.text.

The following code example demonstrates the DynamicDictionary class, which is derived from the DynamicObject class. The DynamicDictionary class contains an object of the Dictionary<string, object> type (Dictionary(Of String, Object) in Visual Basic) to store the key-value pairs, and overrides the M:System.Dynamic.DynamicObject.TrySetMember(System.Dynamic.SetMemberBinder,System.Object) and M:System.Dynamic.DynamicObject.TryGetMember(System.Dynamic.GetMemberBinder,System.Object@) methods to support the new syntax. It also provides a Count property, which shows how many dynamic properties the dictionary contains.

// 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

For more examples, see Creating Wrappers with DynamicObjecthttp://go.microsoft.com/fwlink/?LinkId=169008 on the C# Frequently Asked Questions blog.

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 4.0
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 4.0
Windows Phone Silverlight
Disponible desde 8.0
Windows Phone
Disponible desde 8.1

Cualquier miembro ( Compartido en Visual Basic) estático público de este tipo es seguro para subprocesos. No se garantiza que los miembros de instancia sean seguros para subprocesos.

Volver al principio
Mostrar: