DynamicObject Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Fournit une classe de base pour spécifier le comportement dynamique au moment de l’exécution. Cette classe doit être héritée de ; vous ne pouvez pas l’instancier directement.
public ref class DynamicObject : System::Dynamic::IDynamicMetaObjectProvider
public class DynamicObject : System.Dynamic.IDynamicMetaObjectProvider
[System.Diagnostics.CodeAnalysis.RequiresDynamicCode("Creating a call site may require dynamic code generation.")]
public class DynamicObject : System.Dynamic.IDynamicMetaObjectProvider
[System.Serializable]
public class DynamicObject : System.Dynamic.IDynamicMetaObjectProvider
type DynamicObject = class
interface IDynamicMetaObjectProvider
[<System.Diagnostics.CodeAnalysis.RequiresDynamicCode("Creating a call site may require dynamic code generation.")>]
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 souhaitez fournir une autre syntaxe pour accéder aux valeurs d’un dictionnaire, afin qu’au lieu d’écrire sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text" dans 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 classe DynamicDictionary contient un objet du type Dictionary<string, object> (Dictionary(Of String, Object) dans Visual Basic) pour stocker les paires clé-valeur et remplace les méthodes TrySetMember 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 Le blog Création de wrappers avec DynamicObject sur le blog Forum aux questions C#.
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. 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’ajout 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 la syntaxe comme 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 méthodes et TryGetMember les TrySetMember méthodes.
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 de type dynamique.
En Visual Basic, les opérations dynamiques sont prises en charge par la liaison tardive. Pour plus d'informations, veuillez consulter Liaison précoce et tardive (Visual Basic).
L’exemple de code suivant montre comment créer une 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 aux 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.
Note
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 que vous devez gérer la mise en cache de distribution dynamique rapide de DLR, créez votre propre implémentation de l’interface IDynamicMetaObjectProvider .
Constructeurs
| Nom | Description |
|---|---|
| DynamicObject() |
Permet aux types dérivés d’initialiser une nouvelle instance du DynamicObject type. |
Méthodes
| Nom | Description |
|---|---|
| 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() |
Sert de fonction de hachage par défaut. (Hérité de Object) |
| GetMetaObject(Expression) |
Fournit une DynamicMetaObject distribution aux méthodes virtuelles dynamiques. L’objet peut être encapsulé à l’intérieur d’un autre DynamicMetaObject pour fournir 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 destinée à être utilisée directement à partir de votre code. |
| GetType() |
Obtient la Type de l’instance actuelle. (Hérité de Object) |
| MemberwiseClone() |
Crée une copie superficielle du Objectactuel. (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 DynamicObject classe peuvent remplacer cette méthode pour spécifier un comportement dynamique pour les opérations telles que l’ajout et la multiplication. |
| TryConvert(ConvertBinder, Object) |
Fournit une implémentation pour les opérations de conversion de type. Les classes dérivées de la DynamicObject classe peuvent remplacer cette méthode pour spécifier un comportement dynamique pour les opérations qui convertissent un objet d’un type en un autre. |
| TryCreateInstance(CreateInstanceBinder, Object[], Object) |
Fournit l’implémentation des 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 des 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 des opérations qui suppriment un membre d’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 des opérations qui obtiennent une valeur par index. Les classes dérivées de la DynamicObject classe peuvent remplacer cette méthode pour spécifier un comportement dynamique pour les opérations d’indexation. |
| TryGetMember(GetMemberBinder, Object) |
Fournit l’implémentation des opérations qui obtiennent des valeurs de membre. Les classes dérivées de la DynamicObject classe peuvent remplacer cette méthode pour spécifier un comportement dynamique pour les opérations telles que l’obtention d’une valeur pour une propriété. |
| TryInvoke(InvokeBinder, Object[], Object) |
Fournit l’implémentation des opérations qui appellent un objet. Les classes dérivées de la DynamicObject classe peuvent remplacer cette méthode pour spécifier un comportement dynamique pour les opérations telles que l’appel d’un objet ou d’un délégué. |
| TryInvokeMember(InvokeMemberBinder, Object[], Object) |
Fournit l’implémentation des opérations qui appellent un membre. Les classes dérivées de la DynamicObject classe peuvent remplacer cette méthode pour spécifier un comportement dynamique pour les opérations telles que l’appel d’une méthode. |
| TrySetIndex(SetIndexBinder, Object[], Object) |
Fournit l’implémentation des opérations qui définissent une valeur par index. Les classes dérivées de la DynamicObject classe peuvent remplacer cette méthode pour spécifier un comportement dynamique pour les opérations qui accèdent aux objets par un index spécifié. |
| TrySetMember(SetMemberBinder, Object) |
Fournit l’implémentation des opérations qui définissent des valeurs de membre. Les classes dérivées de la DynamicObject classe peuvent remplacer cette méthode pour spécifier un comportement dynamique pour les opérations telles que la définition d’une valeur pour une propriété. |
| TryUnaryOperation(UnaryOperationBinder, Object) |
Fournit une implémentation pour les opérations unaires. Les classes dérivées de la DynamicObject classe peuvent remplacer cette méthode pour spécifier un comportement dynamique pour les opérations telles que la négation, l’incrémentation ou la décrémentation. |