DynamicObject DynamicObject DynamicObject DynamicObject Class

Définition

Fournit une classe de base pour la spécification du comportement dynamique pendant l'exécution.Provides a base class for specifying dynamic behavior at run time. Cette classe doit être héritée ;vous ne pouvez pas l'instancier directement.This class must be inherited from; you cannot instantiate it directly.

public ref class DynamicObject : System::Dynamic::IDynamicMetaObjectProvider
[System.Serializable]
public class DynamicObject : System.Dynamic.IDynamicMetaObjectProvider
type DynamicObject = class
    interface IDynamicMetaObjectProvider
Public Class DynamicObject
Implements IDynamicMetaObjectProvider
Héritage
DynamicObjectDynamicObjectDynamicObjectDynamicObject
Dérivé
Attributs
Implémente

Exemples

Supposons que vous souhaitiez fournir une autre syntaxe pour accéder aux valeurs dans un dictionnaire, de sorte qu' sampleDictionary["Text"] = "Sample text" ausampleDictionary("Text") = "Sample text" lieu d’écrire (dans Visual Basic) sampleDictionary.Text = "Sample text", vous puissiez écrire.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". En outre, vous souhaitez que cette syntaxe ne respecte pas la casse, de sampleDictionary.Text sorte que soit sampleDictionary.textéquivalent à.Also, you want this syntax to be case-insensitive, so that sampleDictionary.Text is equivalent to sampleDictionary.text.

L’exemple de code suivant illustre DynamicDictionary la classe, qui est dérivée DynamicObject de la classe.The following code example demonstrates the DynamicDictionary class, which is derived from the DynamicObject class. La DynamicDictionary classe contient un objet Dictionary<string, object> du type (Dictionary(Of String, Object) dans Visual Basic) pour stocker les paires clé-valeur et substitue les TrySetMember méthodes et TryGetMember pour prendre en charge la nouvelle syntaxe.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 TrySetMember and TryGetMember methods to support the new syntax. Il fournit également une Count propriété, qui indique le nombre de propriétés dynamiques contenues dans le dictionnaire.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
' The class derived from DynamicObject.
Public Class DynamicDictionary
    Inherits DynamicObject

    ' The inner dictionary.
    Dim dictionary As New Dictionary(Of String, Object)

    ' This property returns the number of elements
    ' in the inner dictionary.
    ReadOnly Property Count As Integer
        Get
            Return dictionary.Count
        End Get
    End Property


    ' If you try to get a value of a property that is
    ' not defined in the class, this method is called.

    Public Overrides Function TryGetMember(
        ByVal binder As System.Dynamic.GetMemberBinder,
        ByRef result As Object) As Boolean

        ' Converting the property name to lowercase
        ' so that property names become case-insensitive.
        Dim name As String = 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, result)
    End Function

    Public Overrides Function TrySetMember(
        ByVal binder As System.Dynamic.SetMemberBinder,
        ByVal value As Object) As Boolean

        ' 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
    End Function
End Class

Sub Main()
    ' Creating a dynamic dictionary.
    Dim person As Object = 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 now case-insensitive,
    ' although they are case-sensitive in C#.
    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 MissingMemberException.
    ' Console.WriteLine(person.address)
End Sub
' This examples has the following output:
' Ellen Adams
' Number of dynamic properties: 2

Pour plus d’exemples, consultez création de wrappers avec DynamicObject sur le C# blog Forum aux questions.For more examples, see Creating Wrappers with DynamicObject on the C# Frequently Asked Questions blog.

Remarques

La DynamicObject classe vous permet de définir les opérations qui peuvent être effectuées sur des objets dynamiques et comment effectuer ces opérations.The DynamicObject class enables you to define which operations can be performed on dynamic objects and how to perform those operations. Par exemple, vous pouvez définir ce qui se passe lorsque vous essayez d’obtenir ou de définir une propriété d’objet, d’appeler une méthode ou d’effectuer des opérations mathématiques standard, telles que l’addition et la multiplication.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.

Cette classe peut être utile si vous souhaitez créer un protocole plus commode pour une bibliothèque.This class can be useful if you want to create a more convenient protocol for a library. Par exemple, si les utilisateurs de votre bibliothèque doivent utiliser une syntaxe Scriptobj.SetProperty("Count", 1)telle que, vous pouvez fournir la possibilité d’utiliser une syntaxe plus simple scriptobj.Count = 1, telle que.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.

Vous ne pouvez pas créer directement une instance DynamicObject de la classe.You cannot directly create an instance of the DynamicObject class. Pour implémenter le comportement dynamique, vous pouvez hériter de la DynamicObject classe et substituer les méthodes nécessaires.To implement the dynamic behavior, you may want to inherit from the DynamicObject class and override necessary methods. Par exemple, si vous avez uniquement besoin d’opérations pour définir et obtenir des propriétés, vous pouvez remplacer TrySetMember uniquement TryGetMember les méthodes et.For example, if you need only operations for setting and getting properties, you can override just the TrySetMember and TryGetMember methods.

Dans C#, pour activer le comportement dynamique pour les instances de classes dérivées de la DynamicObject classe, vous devez utiliser le dynamic mot clé.In C#, to enable dynamic behavior for instances of classes derived from the DynamicObject class, you must use the dynamic keyword. Pour plus d’informations, consultez Utilisation du type dynamic.For more information, see Using Type dynamic.

Dans Visual Basic, les opérations dynamiques sont prises en charge par la liaison tardive.In Visual Basic, dynamic operations are supported by late binding. Pour plus d’informations, consultez liaison précoce et tardive.For more information, see Early and Late Binding.

L’exemple de code suivant montre comment créer une instance d’une classe dérivée de la DynamicObject classe.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 ();  
Public Class SampleDynamicObject   
    Inherits DynamicObject  
'...  
Dim sampleObject As Object = New SampleDynamicObject()  

Vous pouvez également ajouter vos propres membres aux classes dérivées de DynamicObject la classe.You can also add your own members to classes derived from the DynamicObject class. Si votre classe définit des propriétés et substitue également la TrySetMember méthode, le Dynamic Language Runtime (DLR) utilise d’abord le Binder de langage pour rechercher une définition statique d’une propriété dans la classe.If your class defines properties and also overrides the TrySetMember method, the dynamic language runtime (DLR) first uses the language binder to look for a static definition of a property in the class. S’il n’existe aucune propriété de ce type, le TrySetMember DLR appelle la méthode.If there is no such property, the DLR calls the TrySetMember method.

La DynamicObject classe implémente l’interface IDynamicMetaObjectProviderdu DLR, ce qui vous permet de partager des DynamicObject instances de la classe entre les langages qui prennent en charge le modèle d’interopérabilité du DLR.The DynamicObject class implements the DLR interface IDynamicMetaObjectProvider, which enables you to share instances of the DynamicObject class between languages that support the DLR interoperability model. Par exemple, vous pouvez créer une instance de la DynamicObject classe dans C# et la passer à une fonction IronPython.For example, you can create an instance of the DynamicObject class in C# and then pass it to an IronPython function. Pour plus d’informations, consultez vue d’ensemble du Dynamic Language Runtime.For more information, see Dynamic Language Runtime Overview.

Notes

Si vous avez un scénario simple dans lequel vous avez besoin d’un objet qui peut uniquement ajouter et supprimer des membres au moment de l’exécution, mais qui n’a pas besoin de définir des opérations spécifiques et ExpandoObject qui n’a pas de membres statiques, utilisez la classe.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 ExpandoObject class.

Si vous avez un scénario plus avancé dans lequel vous devez définir la manière dont les objets dynamiques participent au protocole d’interopérabilité, ou si vous devez gérer la mise en cache de distribution dynamique rapide du DLR IDynamicMetaObjectProvider , créez votre propre implémentation de l’interface.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 IDynamicMetaObjectProvider interface.

Constructeurs

DynamicObject() DynamicObject() DynamicObject() DynamicObject()

Permet aux types dérivés d'initialiser une nouvelle instance du type DynamicObject.Enables derived types to initialize a new instance of the DynamicObject type.

Méthodes

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Détermine si l'objet spécifié est identique à l'objet actuel.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetDynamicMemberNames() GetDynamicMemberNames() GetDynamicMemberNames() GetDynamicMemberNames()

Retourne l'énumération de tous les noms de membres dynamiques.Returns the enumeration of all dynamic member names.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Fait office de fonction de hachage par défaut.Serves as the default hash function.

(Inherited from Object)
GetMetaObject(Expression) GetMetaObject(Expression) GetMetaObject(Expression) GetMetaObject(Expression)

Fournit un DynamicMetaObject qui distribue aux méthodes virtuelles dynamiques.Provides a DynamicMetaObject that dispatches to the dynamic virtual methods. L'objet peut être encapsulé dans un autre DynamicMetaObject pour définir un comportement personnalisé pour des actions individuelles.The object can be encapsulated inside another DynamicMetaObject to provide custom behavior for individual actions. Cette méthode prend en charge l'infrastructure Dynamic Language Runtime pour les implémenteurs de langage et n'est pas conçue pour être utilisée directement dans votre code.This method supports the Dynamic Language Runtime infrastructure for language implementers and it is not intended to be used directly from your code.

GetType() GetType() GetType() GetType()

Obtient le Type de l'instance actuelle.Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Crée une copie superficielle de l'objet Object actuel.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Retourne une chaîne qui représente l'objet actuel.Returns a string that represents the current object.

(Inherited from Object)
TryBinaryOperation(BinaryOperationBinder, Object, Object) TryBinaryOperation(BinaryOperationBinder, Object, Object) TryBinaryOperation(BinaryOperationBinder, Object, Object) TryBinaryOperation(BinaryOperationBinder, Object, Object)

Fournit une implémentation pour les opérations binaires.Provides implementation for binary operations. Les classes dérivées de la classe DynamicObject peuvent substituer cette méthode afin de spécifier le comportement dynamique pour certaines opérations telles que l'addition et la multiplication.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as addition and multiplication.

TryConvert(ConvertBinder, Object) TryConvert(ConvertBinder, Object) TryConvert(ConvertBinder, Object) TryConvert(ConvertBinder, Object)

Fournit l'implémentation pour les opérations de conversion de type.Provides implementation for type conversion operations. Les classes dérivées de la classe DynamicObject peuvent substituer cette méthode pour spécifier le comportement dynamique pour certaines opérations qui convertissent un objet d'un type en un autre.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations that convert an object from one type to another.

TryCreateInstance(CreateInstanceBinder, Object[], Object) TryCreateInstance(CreateInstanceBinder, Object[], Object) TryCreateInstance(CreateInstanceBinder, Object[], Object) TryCreateInstance(CreateInstanceBinder, Object[], Object)

Fournit l'implémentation pour les opérations qui initialisent une nouvelle instance d'un objet dynamique.Provides the implementation for operations that initialize a new instance of a dynamic object. Cette méthode n'est pas destinée à être utilisée en C# ou en Visual Basic.This method is not intended for use in C# or Visual Basic.

TryDeleteIndex(DeleteIndexBinder, Object[]) TryDeleteIndex(DeleteIndexBinder, Object[]) TryDeleteIndex(DeleteIndexBinder, Object[]) TryDeleteIndex(DeleteIndexBinder, Object[])

Fournit l'implémentation pour les opérations qui suppriment un objet par index.Provides the implementation for operations that delete an object by index. Cette méthode n'est pas destinée à être utilisée en C# ou en Visual Basic.This method is not intended for use in C# or Visual Basic.

TryDeleteMember(DeleteMemberBinder) TryDeleteMember(DeleteMemberBinder) TryDeleteMember(DeleteMemberBinder) TryDeleteMember(DeleteMemberBinder)

Fournit l'implémentation pour les opérations qui suppriment un membre objet.Provides the implementation for operations that delete an object member. Cette méthode n'est pas destinée à être utilisée en C# ou en Visual Basic.This method is not intended for use in C# or Visual Basic.

TryGetIndex(GetIndexBinder, Object[], Object) TryGetIndex(GetIndexBinder, Object[], Object) TryGetIndex(GetIndexBinder, Object[], Object) TryGetIndex(GetIndexBinder, Object[], Object)

Fournit l'implémentation pour les opérations qui obtiennent une valeur par index.Provides the implementation for operations that get a value by index. Les classes dérivées de la classe DynamicObject peuvent substituer cette méthode afin de spécifier le comportement dynamique pour les opérations d'indexation.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for indexing operations.

TryGetMember(GetMemberBinder, Object) TryGetMember(GetMemberBinder, Object) TryGetMember(GetMemberBinder, Object) TryGetMember(GetMemberBinder, Object)

Fournit l'implémentation pour les opérations qui obtiennent des valeurs de membre.Provides the implementation for operations that get member values. Les classes dérivées de la classe DynamicObject peuvent substituer cette méthode afin de spécifier le comportement dynamique pour certaines opérations telles que l'obtention d'une valeur pour une propriété.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as getting a value for a property.

TryInvoke(InvokeBinder, Object[], Object) TryInvoke(InvokeBinder, Object[], Object) TryInvoke(InvokeBinder, Object[], Object) TryInvoke(InvokeBinder, Object[], Object)

Fournit l'implémentation pour les opérations qui appellent un objet.Provides the implementation for operations that invoke an object. Les classes dérivées de la classe DynamicObject peuvent substituer cette méthode afin de spécifier le comportement dynamique pour certaines opérations telles que l'appel d'un objet ou d'un délégué.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as invoking an object or a delegate.

TryInvokeMember(InvokeMemberBinder, Object[], Object) TryInvokeMember(InvokeMemberBinder, Object[], Object) TryInvokeMember(InvokeMemberBinder, Object[], Object) TryInvokeMember(InvokeMemberBinder, Object[], Object)

Fournit l'implémentation pour les opérations qui appellent un membre.Provides the implementation for operations that invoke a member. Les classes dérivées de la classe DynamicObject peuvent substituer cette méthode afin de spécifier le comportement dynamique pour certaines opérations telles que l'appel d'une méthode.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as calling a method.

TrySetIndex(SetIndexBinder, Object[], Object) TrySetIndex(SetIndexBinder, Object[], Object) TrySetIndex(SetIndexBinder, Object[], Object) TrySetIndex(SetIndexBinder, Object[], Object)

Fournit l'implémentation pour les opérations qui définissent une valeur par index.Provides the implementation for operations that set a value by index. Les classes dérivées de la classe DynamicObject peuvent substituer cette méthode pour spécifier le comportement dynamique pour certaines opérations qui accèdent aux objets par un index spécifié.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations that access objects by a specified index.

TrySetMember(SetMemberBinder, Object) TrySetMember(SetMemberBinder, Object) TrySetMember(SetMemberBinder, Object) TrySetMember(SetMemberBinder, Object)

Fournit l'implémentation pour les opérations qui définissent des valeurs de membre.Provides the implementation for operations that set member values. Les classes dérivées de la classe DynamicObject peuvent substituer cette méthode afin de spécifier le comportement dynamique pour certaines opérations telles que la définition d'une valeur pour une propriété.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as setting a value for a property.

TryUnaryOperation(UnaryOperationBinder, Object) TryUnaryOperation(UnaryOperationBinder, Object) TryUnaryOperation(UnaryOperationBinder, Object) TryUnaryOperation(UnaryOperationBinder, Object)

Fournit l'implémentation pour les opérations unaires.Provides implementation for unary operations. Les classes dérivées de la classe DynamicObject peuvent substituer cette méthode afin de spécifier le comportement dynamique pour certaines opérations telles que la négation, l'incrémentation ou la décrémentation.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as negation, increment, or decrement.

S’applique à