Freigeben über


DynamicObject Klasse

Definition

Stellt eine Basisklasse zum Angeben von dynamischem Verhalten zur Laufzeit bereit. Diese Klasse muss vererbt werden und kann nicht direkt instanziiert werden.

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
Vererbung
DynamicObject
Abgeleitet
Attribute
Implementiert

Beispiele

Angenommen, Sie möchten eine alternative Syntax für den Zugriff auf Werte in einem Wörterbuch bereitstellen, sodass Sie anstelle von sampleDictionary["Text"] = "Sample text" Schreiben (sampleDictionary("Text") = "Sample text" in Visual Basic) schreiben sampleDictionary.Text = "Sample text"können. Außerdem soll bei dieser Syntax die Groß-/Kleinschreibung nicht beachtet werden, sodass dies sampleDictionary.Text entspricht sampleDictionary.text.

Im folgenden Codebeispiel wird die DynamicDictionary -Klasse veranschaulicht, die von der DynamicObject -Klasse abgeleitet wird. Die DynamicDictionary -Klasse enthält ein Objekt vom Dictionary<string, object> Typ (Dictionary(Of String, Object) in Visual Basic), um die Schlüssel-Wert-Paare zu speichern, und überschreibt die TrySetMember Methoden und TryGetMember zur Unterstützung der neuen Syntax. Außerdem wird eine Count -Eigenschaft bereitgestellt, die angibt, wie viele dynamische Eigenschaften das Wörterbuch enthält.

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

Weitere Beispiele finden Sie unter Erstellen von Wrappern mit DynamicObject im C#-Blog mit häufig gestellten Fragen.

Hinweise

Mit DynamicObject der -Klasse können Sie definieren, welche Vorgänge für dynamische Objekte ausgeführt werden können und wie diese Vorgänge ausgeführt werden. Sie können beispielsweise definieren, was geschieht, wenn Sie versuchen, eine Objekteigenschaft abzurufen oder festzulegen, eine Methode aufzurufen oder mathematische Standardoperationen wie Addition und Multiplikation auszuführen.

Diese Klasse kann nützlich sein, wenn Sie ein komfortableres Protokoll für eine Bibliothek erstellen möchten. Wenn Benutzer Ihrer Bibliothek beispielsweise Syntax wie Scriptobj.SetProperty("Count", 1)verwenden müssen, können Sie die Möglichkeit bieten, scriptobj.Count = 1viel einfachere Syntax wie zu verwenden.

Sie können keine instance der DynamicObject -Klasse direkt erstellen. Um das dynamische Verhalten zu implementieren, sollten Sie von der -Klasse erben und die DynamicObject erforderlichen Methoden außer Kraft setzen. Wenn Sie beispielsweise nur Vorgänge zum Festlegen und Abrufen von Eigenschaften benötigen, können Sie nur die TrySetMember Methoden und TryGetMember überschreiben.

Um dynamisches Verhalten für Instanzen von Klassen zu aktivieren, die von der DynamicObject -Klasse abgeleitet werden, müssen Sie in C# die dynamic Schlüsselwort (keyword) verwenden. Weitere Informationen finden Sie unter Verwenden von dynamischen Typen.

In Visual Basic werden dynamische Vorgänge durch späte Bindung unterstützt. Weitere Informationen finden Sie unter Frühe und späte Bindung (Visual Basic).

Im folgenden Codebeispiel wird veranschaulicht, wie eine instance einer Klasse erstellt wird, die von der DynamicObject -Klasse abgeleitet wird.

public class SampleDynamicObject : DynamicObject {}  
//...  
dynamic sampleObject = new SampleDynamicObject ();  
Public Class SampleDynamicObject   
    Inherits DynamicObject  
'...  
Dim sampleObject As Object = New SampleDynamicObject()  

Sie können auch eigene Member zu von der -Klasse abgeleiteten DynamicObject Klassen hinzufügen. Wenn Ihre Klasse Eigenschaften definiert und auch die TrySetMember -Methode überschreibt, verwendet die Dynamic Language Runtime (DLR) zunächst den Sprachbinder, um nach einer statischen Definition einer Eigenschaft in der Klasse zu suchen. Wenn keine solche Eigenschaft vorhanden ist, ruft das DLR die -Methode auf TrySetMember .

Die DynamicObject -Klasse implementiert die DLR-Schnittstelle IDynamicMetaObjectProvider, mit der Sie Instanzen der DynamicObject -Klasse zwischen Sprachen freigeben können, die das DLR-Interoperabilitätsmodell unterstützen. Sie können beispielsweise eine instance der DynamicObject Klasse in C# erstellen und dann an eine IronPython-Funktion übergeben. Weitere Informationen finden Sie unter Dynamic Language Runtime Overview.

Hinweis

Wenn Sie ein einfaches Szenario haben, in dem Sie ein Objekt benötigen, das nur Zur Laufzeit Member hinzufügen und entfernen kann, aber keine bestimmten Vorgänge definieren muss und keine statischen Member aufweist, verwenden Sie die ExpandoObject -Klasse.

Wenn Sie ein komplexeres Szenario haben, in dem Sie definieren müssen, wie dynamische Objekte in das Interoperabilitätsprotokoll aufgenommen werden, oder wenn Sie die schnelle zwischenspeichernde dynamische Verteilung von DLR verwalten müssen, erstellen Sie eine eigene Implementierung der IDynamicMetaObjectProvider Schnittstelle.

Konstruktoren

DynamicObject()

Ermöglicht es abgeleiteten Typen, eine neue Instanz des DynamicObject-Typs zu initialisieren.

Methoden

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
GetDynamicMemberNames()

Gibt die Enumeration aller dynamischen Membernamen zurück.

GetHashCode()

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetMetaObject(Expression)

Stellt ein DynamicMetaObject bereit, das an die dynamischen virtuellen Methoden sendet. Das Objekt kann in einem anderen DynamicMetaObject gekapselt werden, um benutzerdefiniertes Verhalten für einzelne Aktionen bereitzustellen. Diese Methode unterstützt die Dynamic Language Runtime-Infrastruktur für Sprachimplementierungen und ist nicht für die direkte Verwendung im Code vorgesehen.

GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)
TryBinaryOperation(BinaryOperationBinder, Object, Object)

Stellt die Implementierung für binäre Operationen bereit. Von der DynamicObject-Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Operationen wie Addition oder Multiplikation anzugeben.

TryConvert(ConvertBinder, Object)

Stellt die Implementierung für Typkonvertierungsvorgänge bereit. Von der DynamicObject-Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Operationen anzugeben, die ein Objekt von einem Typ in einen anderen konvertieren.

TryCreateInstance(CreateInstanceBinder, Object[], Object)

Stellt die Implementierung für Vorgänge bereit, die eine neue Instanz eines dynamischen Objekts initialisieren. Diese Methode ist nicht zur Verwendung in C# oder Visual Basic vorgesehen.

TryDeleteIndex(DeleteIndexBinder, Object[])

Stellt die Implementierung für Vorgänge bereit, die ein Objekt nach Index löschen. Diese Methode ist nicht zur Verwendung in C# oder Visual Basic vorgesehen.

TryDeleteMember(DeleteMemberBinder)

Stellt die Implementierung für Vorgänge bereit, die einen Objektmember löschen. Diese Methode ist nicht zur Verwendung in C# oder Visual Basic vorgesehen.

TryGetIndex(GetIndexBinder, Object[], Object)

Stellt die Implementierung für Vorgänge bereit, die einen Wert nach Index abrufen. Von der DynamicObject-Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Indexvorgänge anzugeben.

TryGetMember(GetMemberBinder, Object)

Stellt die Implementierung für Vorgänge bereit, die Memberwerte abrufen. Von der DynamicObject-Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Vorgänge wie das Abrufen eines Werts für eine Eigenschaft anzugeben.

TryInvoke(InvokeBinder, Object[], Object)

Stellt die Implementierung für Vorgänge bereit, die ein Objekt aufrufen. Von der DynamicObject-Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Vorgänge wie das Aufrufen eines Objekts oder Delegaten anzugeben.

TryInvokeMember(InvokeMemberBinder, Object[], Object)

Stellt die Implementierung für Vorgänge bereit, die einen Member aufrufen. Von der DynamicObject-Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Vorgänge wie das Aufrufen einer Methode anzugeben.

TrySetIndex(SetIndexBinder, Object[], Object)

Stellt die Implementierung für Vorgänge bereit, die einen Wert nach Index festlegen. Von der DynamicObject-Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Vorgänge anzugeben, die auf Objekte mit einem angegebenen Index zugreifen.

TrySetMember(SetMemberBinder, Object)

Stellt die Implementierung für Vorgänge bereit, die Memberwerte festlegen. Von der DynamicObject-Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Vorgänge wie das Festlegen eines Werts für eine Eigenschaft anzugeben.

TryUnaryOperation(UnaryOperationBinder, Object)

Stellt die Implementierung für unäre Operationen bereit. Von der DynamicObject-Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Vorgänge wie Negation, Inkrement oder Dekrement anzugeben.

Gilt für: