DynamicObject Classe

Definizione

Fornisce una classe di base per specificare il comportamento dinamico in fase di esecuzione.Provides a base class for specifying dynamic behavior at run time. Questa classe deve essere ereditata; non è possibile crearne direttamente un'istanza.This class must be inherited from; you cannot instantiate it directly.

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
Public Class DynamicObject
Implements IDynamicMetaObjectProvider
Ereditarietà
DynamicObject
Derivato
Attributi
Implementazioni

Esempio

Si supponga di voler specificare una sintassi alternativa per accedere ai valori in un dizionario, in modo che invece di scrivere sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text" in Visual Basic), sia possibile scrivere sampleDictionary.Text = "Sample text".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". Inoltre, si desidera che questa sintassi non venga fatta distinzione tra maiuscole e minuscole, in modo che sampleDictionary.Text sia equivalente a sampleDictionary.text.Also, you want this syntax to be case-insensitive, so that sampleDictionary.Text is equivalent to sampleDictionary.text.

Nell'esempio di codice riportato di seguito viene illustrata la classe DynamicDictionary, derivata dalla classe DynamicObject.The following code example demonstrates the DynamicDictionary class, which is derived from the DynamicObject class. La classe DynamicDictionary contiene un oggetto del tipo di Dictionary<string, object> (Dictionary(Of String, Object) in Visual Basic) per archiviare le coppie chiave-valore ed esegue l'override dei metodi TrySetMember e TryGetMember per supportare la nuova sintassi.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. Fornisce inoltre una proprietà Count, che mostra il numero di proprietà dinamiche contenute nel dizionario.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

Per altri esempi, vedere creazione di wrapper con DynamicObject nel Blog C# di domande frequenti.For more examples, see Creating Wrappers with DynamicObject on the C# Frequently Asked Questions blog.

Commenti

La classe DynamicObject consente di definire le operazioni che possono essere eseguite sugli oggetti dinamici e come eseguire tali operazioni.The DynamicObject class enables you to define which operations can be performed on dynamic objects and how to perform those operations. Ad esempio, è possibile definire cosa accade quando si tenta di ottenere o impostare una proprietà dell'oggetto, chiamare un metodo o eseguire operazioni matematiche standard, ad esempio l'aggiunta e la moltiplicazione.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.

Questa classe può essere utile se si desidera creare un protocollo più pratico per una raccolta.This class can be useful if you want to create a more convenient protocol for a library. Se, ad esempio, gli utenti della libreria devono usare la sintassi come Scriptobj.SetProperty("Count", 1), è possibile usare una sintassi molto più semplice, come scriptobj.Count = 1.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.

Non è possibile creare direttamente un'istanza della classe DynamicObject.You cannot directly create an instance of the DynamicObject class. Per implementare il comportamento dinamico, è possibile che si desideri ereditare dalla classe DynamicObject ed eseguire l'override dei metodi necessari.To implement the dynamic behavior, you may want to inherit from the DynamicObject class and override necessary methods. Se, ad esempio, sono necessarie solo le operazioni per l'impostazione e il recupero delle proprietà, è possibile eseguire l'override solo dei metodi TrySetMember e TryGetMember.For example, if you need only operations for setting and getting properties, you can override just the TrySetMember and TryGetMember methods.

In C#, per abilitare il comportamento dinamico per le istanze delle classi derivate dalla classe DynamicObject, è necessario usare la parola chiave dynamic.In C#, to enable dynamic behavior for instances of classes derived from the DynamicObject class, you must use the dynamic keyword. Per altre informazioni, vedere Uso del tipo dynamic.For more information, see Using Type dynamic.

In Visual Basic, le operazioni dinamiche sono supportate dall'associazione tardiva.In Visual Basic, dynamic operations are supported by late binding. Per ulteriori informazioni, vedere associazione anticipata e tardiva (Visual Basic).For more information, see Early and Late Binding (Visual Basic).

Nell'esempio di codice riportato di seguito viene illustrato come creare un'istanza di una classe derivata dalla classe DynamicObject.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()  

È anche possibile aggiungere membri personalizzati alle classi derivate dalla classe DynamicObject.You can also add your own members to classes derived from the DynamicObject class. Se la classe definisce proprietà ed esegue l'override anche del metodo TrySetMember, il linguaggio DLR (Dynamic Language Runtime) USA innanzitutto lo strumento di associazione del linguaggio per cercare una definizione statica di una proprietà nella 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. Se tale proprietà non è presente, DLR chiama il metodo TrySetMember.If there is no such property, the DLR calls the TrySetMember method.

La classe DynamicObject implementa l'interfaccia DLR IDynamicMetaObjectProvider, che consente di condividere le istanze della classe DynamicObject tra i linguaggi che supportano il modello di interoperabilità 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. Ad esempio, è possibile creare un'istanza della classe DynamicObject in C# e passarla quindi a una funzione IronPython.For example, you can create an instance of the DynamicObject class in C# and then pass it to an IronPython function. Per altre informazioni, vedere Cenni preliminari su Dynamic Language Runtime.For more information, see Dynamic Language Runtime Overview.

Nota

Se si dispone di uno scenario semplice in cui è necessario un oggetto che può aggiungere e rimuovere membri solo in fase di esecuzione, ma non è necessario definire operazioni specifiche e non dispone di membri statici, utilizzare la classe ExpandoObject.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.

Se si dispone di uno scenario più avanzato in cui è necessario definire il modo in cui gli oggetti dinamici partecipano al protocollo di interoperabilità oppure è necessario gestire la memorizzazione nella cache di invio dinamico rapido di DLR, creare un'implementazione personalizzata dell'interfaccia IDynamicMetaObjectProvider.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.

Costruttori

DynamicObject()

Consente ai tipi derivati di creare una nuova istanza del tipo DynamicObject.Enables derived types to initialize a new instance of the DynamicObject type.

Metodi

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.Determines whether the specified object is equal to the current object.

(Ereditato da Object)
GetDynamicMemberNames()

Restituisce l'enumerazione di tutti i nomi di membro dinamici.Returns the enumeration of all dynamic member names.

GetHashCode()

Funge da funzione hash predefinita.Serves as the default hash function.

(Ereditato da Object)
GetMetaObject(Expression)

Fornisce un oggetto DynamicMetaObject che invia ai metodi virtuali dinamici.Provides a DynamicMetaObject that dispatches to the dynamic virtual methods. L'oggetto può essere incapsulato all'interno di un altro oggetto DynamicMetaObject per fornire il comportamento personalizzato per singole azioni.The object can be encapsulated inside another DynamicMetaObject to provide custom behavior for individual actions. Questo metodo supporta l'infrastruttura DLR (Dynamic Language Runtime) per gli implementatori del linguaggio e non è destinato all'utilizzo direttamente dal codice.This method supports the Dynamic Language Runtime infrastructure for language implementers and it is not intended to be used directly from your code.

GetType()

Ottiene l'oggetto Type dell'istanza corrente.Gets the Type of the current instance.

(Ereditato da Object)
MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.Creates a shallow copy of the current Object.

(Ereditato da Object)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.Returns a string that represents the current object.

(Ereditato da Object)
TryBinaryOperation(BinaryOperationBinder, Object, Object)

Fornisce l'implementazione per le operazioni binarie.Provides implementation for binary operations. Le classi derivate dalla classe DynamicObject possono eseguire l'override di questo metodo per specificare il comportamento dinamico per operazioni quali l'aggiunta e la moltiplicazione.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as addition and multiplication.

TryConvert(ConvertBinder, Object)

Fornisce l'implementazione per le operazioni di conversione dei tipi.Provides implementation for type conversion operations. Le classi derivate dalla classe DynamicObject possono eseguire l'override di questo metodo per specificare il comportamento dinamico per operazioni che eseguono la conversione di un oggetto da un tipo a un altro.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)

Fornisce l'implementazione per le operazioni che creano una nuova istanza di un oggetto dinamico.Provides the implementation for operations that initialize a new instance of a dynamic object. Questo metodo non può essere utilizzato in C# o in Visual Basic.This method is not intended for use in C# or Visual Basic.

TryDeleteIndex(DeleteIndexBinder, Object[])

Fornisce l'implementazione per operazioni che eliminano un oggetto in base all'indice.Provides the implementation for operations that delete an object by index. Questo metodo non può essere utilizzato in C# o in Visual Basic.This method is not intended for use in C# or Visual Basic.

TryDeleteMember(DeleteMemberBinder)

Fornisce l'implementazione per operazioni che eliminano un membro di un oggetto.Provides the implementation for operations that delete an object member. Questo metodo non può essere utilizzato in C# o in Visual Basic.This method is not intended for use in C# or Visual Basic.

TryGetIndex(GetIndexBinder, Object[], Object)

Fornisce l'implementazione per operazioni che ottengono un valore in base all'indice.Provides the implementation for operations that get a value by index. Le classi derivate dalla classe DynamicObject possono eseguire l'override di questo metodo per specificare il comportamento dinamico per operazioni di indicizzazione.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for indexing operations.

TryGetMember(GetMemberBinder, Object)

Fornisce l'implementazione per operazioni che ottengono i valori dei membri.Provides the implementation for operations that get member values. Le classi derivate dalla classe DynamicObject possono eseguire l'override di questo metodo per specificare il comportamento dinamico per operazioni quale l'acquisizione di un valore per una proprietà.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)

Fornisce l'implementazione per operazioni che richiamano un oggetto.Provides the implementation for operations that invoke an object. Le classi derivate dalla classe DynamicObject possono eseguire l'override di questo metodo per specificare il comportamento dinamico per operazioni quale il richiamo di un oggetto o un delegato.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)

Fornisce l'implementazione per operazioni che richiamano un membro.Provides the implementation for operations that invoke a member. Le classi derivate dalla classe DynamicObject possono eseguire l'override di questo metodo per specificare il comportamento dinamico per operazioni quale la chiamata a un metodo.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)

Fornisce l'implementazione per operazioni che impostano un valore in base all'indice.Provides the implementation for operations that set a value by index. Le classi derivate dalla classe DynamicObject possono eseguire l'override di questo metodo per specificare il comportamento dinamico per operazioni che accedono a oggetti in base a un indice specificato.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)

Fornisce l'implementazione per operazioni che impostano i valori dei membri.Provides the implementation for operations that set member values. Le classi derivate dalla classe DynamicObject possono eseguire l'override di questo metodo per specificare il comportamento dinamico per operazioni quale l'impostazione di un valore per una proprietà.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)

Fornisce l'implementazione per le operazioni unarie.Provides implementation for unary operations. Le classi derivate dalla classe DynamicObject possono eseguire l'override di questo metodo per specificare il comportamento dinamico per operazioni quale negazione, incremento o decremento.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as negation, increment, or decrement.

Si applica a