Partager via


DynamicObject Classe

Définition

Fournit une classe de base pour spécifier le comportement dynamique au moment de l'exécution. Cette classe doit être héritée ; vous ne pouvez pas l'instancier directement.

public ref class DynamicObject : System::Dynamic::IDynamicMetaObjectProvider
public class DynamicObject : System.Dynamic.IDynamicMetaObjectProvider
[System.Serializable]
public class DynamicObject : System.Dynamic.IDynamicMetaObjectProvider
type DynamicObject = class
    interface IDynamicMetaObjectProvider
[<System.Serializable>]
type DynamicObject = class
    interface IDynamicMetaObjectProvider
Public Class DynamicObject
Implements IDynamicMetaObjectProvider
Héritage
DynamicObject
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’au lieu d’écrire sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text" en Visual Basic), vous pouvez écrire sampleDictionary.Text = "Sample text". En outre, vous souhaitez que cette syntaxe ne respecte pas la casse, ce qui sampleDictionary.Text équivaut à sampleDictionary.text.

L’exemple de code suivant illustre la DynamicDictionary classe, qui est dérivée de la DynamicObject classe . La DynamicDictionary classe contient un objet du Dictionary<string, object> type (Dictionary(Of String, Object) en Visual Basic) pour stocker les paires clé-valeur et remplace les TrySetMember méthodes et TryGetMember pour prendre en charge la nouvelle syntaxe. Il fournit également une Count propriété, qui indique le nombre de propriétés dynamiques que contient le dictionnaire.

// 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 blog Forum aux questions C#.

Remarques

La DynamicObject classe vous permet de définir quelles opérations peuvent être effectuées sur des objets dynamiques et comment effectuer ces opérations. 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.

Cette classe peut être utile si vous souhaitez créer un protocole plus pratique pour une bibliothèque. Par exemple, si les utilisateurs de votre bibliothèque doivent utiliser une syntaxe telle que Scriptobj.SetProperty("Count", 1), vous pouvez fournir la possibilité d’utiliser une syntaxe beaucoup plus simple, comme scriptobj.Count = 1.

Vous ne pouvez pas créer directement une instance de la DynamicObject classe. Pour implémenter le comportement dynamique, vous pouvez hériter de la DynamicObject classe et remplacer les méthodes nécessaires. Par exemple, si vous avez uniquement besoin d’opérations pour définir et obtenir des propriétés, vous pouvez remplacer uniquement les TrySetMember méthodes et TryGetMember .

En 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é. Pour plus d’informations, consultez Utilisation du type dynamic.

En Visual Basic, les opérations dynamiques sont prises en charge par la liaison tardive. Pour plus d’informations, consultez Liaison précoce et tardive (Visual Basic).

L’exemple de code suivant montre comment créer un instance d’une classe dérivée de la DynamicObject classe .

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 à des classes dérivées de la DynamicObject classe . Si votre classe définit des propriétés et remplace également la TrySetMember méthode, le runtime de langage dynamique (DLR) utilise d’abord le classeur de langage pour rechercher une définition statique d’une propriété dans la classe. S’il n’existe aucune propriété de ce type, le DLR appelle la TrySetMember méthode .

La DynamicObject classe implémente l’interface IDynamicMetaObjectProviderDLR , qui vous permet de partager des instances de la DynamicObject classe entre les langages qui prennent en charge le modèle d’interopérabilité DLR. Par exemple, vous pouvez créer une instance de la DynamicObject classe en C#, puis la passer à une fonction IronPython. Pour plus d’informations, consultez Vue d’ensemble du runtime de langage dynamique.

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 n’a pas de membres statiques, utilisez la ExpandoObject classe .

Si vous avez un scénario plus avancé dans lequel vous devez définir la façon dont les objets dynamiques participent au protocole d’interopérabilité, ou si vous devez gérer la mise en cache de répartition dynamique rapide DLR, créez votre propre implémentation de l’interface IDynamicMetaObjectProvider .

Constructeurs

DynamicObject()

Permet aux types dérivés d'initialiser une nouvelle instance du type DynamicObject.

Méthodes

Equals(Object)

Détermine si l'objet spécifié est égal à l'objet actuel.

(Hérité de Object)
GetDynamicMemberNames()

Retourne l'énumération de tous les noms de membres dynamiques.

GetHashCode()

Fait office de fonction de hachage par défaut.

(Hérité de Object)
GetMetaObject(Expression)

Fournit un DynamicMetaObject qui distribue aux méthodes virtuelles dynamiques. L'objet peut être encapsulé dans un autre DynamicMetaObject pour définir un comportement personnalisé pour des actions individuelles. 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.

GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)
TryBinaryOperation(BinaryOperationBinder, Object, Object)

Fournit une implémentation pour les opérations binaires. 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.

TryConvert(ConvertBinder, Object)

Fournit l'implémentation pour les opérations de conversion de type. 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.

TryCreateInstance(CreateInstanceBinder, Object[], Object)

Fournit l'implémentation pour les opérations qui initialisent une nouvelle instance d'un objet dynamique. Cette méthode n'est pas destinée à être utilisée en C# ou en Visual Basic.

TryDeleteIndex(DeleteIndexBinder, Object[])

Fournit l'implémentation pour les opérations qui suppriment un objet par index. Cette méthode n'est pas destinée à être utilisée en C# ou en Visual Basic.

TryDeleteMember(DeleteMemberBinder)

Fournit l'implémentation pour les opérations qui suppriment un membre objet. Cette méthode n'est pas destinée à être utilisée en C# ou en Visual Basic.

TryGetIndex(GetIndexBinder, Object[], Object)

Fournit l'implémentation pour les opérations qui obtiennent une valeur par 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.

TryGetMember(GetMemberBinder, Object)

Fournit l'implémentation pour les opérations qui obtiennent des valeurs de membre. 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é.

TryInvoke(InvokeBinder, Object[], Object)

Fournit l'implémentation pour les opérations qui appellent un objet. 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é.

TryInvokeMember(InvokeMemberBinder, Object[], Object)

Fournit l'implémentation pour les opérations qui appellent un membre. 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.

TrySetIndex(SetIndexBinder, Object[], Object)

Fournit l'implémentation pour les opérations qui définissent une valeur par 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é.

TrySetMember(SetMemberBinder, Object)

Fournit l'implémentation pour les opérations qui définissent des valeurs de membre. 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é.

TryUnaryOperation(UnaryOperationBinder, Object)

Fournit l'implémentation pour les opérations unaires. 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.

S’applique à