DynamicObject Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt eine Basisklasse zum Angeben des dynamischen Verhaltens zur Laufzeit bereit. Diese Klasse muss geerbt werden; Sie können sie nicht direkt instanziieren.
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
- Vererbung
-
DynamicObject
- Abgeleitet
- Attribute
- Implementiert
Beispiele
Gehen Sie davon aus, dass Sie eine alternative Syntax für den Zugriff auf Werte in einem Wörterbuch bereitstellen möchten, sodass Sie nicht sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text" in Visual Basic) schreiben möchten, sondern sampleDictionary.Text = "Sample text" schreiben. Außerdem möchten Sie, dass bei dieser Syntax die Groß-/Kleinschreibung nicht beachtet wird, sodass sie sampleDictionary.Text gleichbedeutend mit der Groß-/Kleinschreibung ist sampleDictionary.text.
Im folgenden Codebeispiel wird die DynamicDictionary Klasse veranschaulicht, die von der DynamicObject Klasse abgeleitet wird. Die DynamicDictionary-Klasse enthält ein Objekt des typs Dictionary<string, object> (Dictionary(Of String, Object) in Visual Basic), um die Schlüsselwertpaare zu speichern, und überschreibt die Methoden TrySetMember und TryGetMember zur Unterstützung der neuen Syntax. Außerdem wird eine Count Eigenschaft bereitgestellt, die zeigt, 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 im C#-Blog "Häufig gestellte Fragen" unter Erstellen von Wrappern mit DynamicObject .
Hinweise
Mit der DynamicObject 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. Beispielsweise können Sie definieren, was passiert, wenn Sie versuchen, eine Objekteigenschaft abzurufen oder festzulegen, eine Methode aufzurufen oder standardmathematische Vorgänge 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 z. B. Syntax Scriptobj.SetProperty("Count", 1)verwenden müssen, können Sie die Möglichkeit bieten, viel einfachere Syntax zu verwenden, z scriptobj.Count = 1. B. .
Sie können keine Instanz der DynamicObject Klasse direkt erstellen. Um das dynamische Verhalten zu implementieren, möchten Sie möglicherweise von der DynamicObject Klasse erben und die erforderlichen Methoden außer Kraft setzen. Wenn Sie z. B. nur Vorgänge zum Festlegen und Abrufen von Eigenschaften benötigen, können Sie nur die und TryGetMember die TrySetMember Methoden außer Kraft setzen.
Wenn Sie in C# dynamisches Verhalten für Instanzen von Klassen aktivieren möchten, die von der DynamicObject Klasse abgeleitet sind, müssen Sie das dynamic Schlüsselwort verwenden. Weitere Informationen finden Sie unter die Verwendung von Type dynamic.
In Visual Basic werden dynamische Vorgänge durch späte Bindung unterstützt. Mehr Informationen finden Sie unter Frühe und späte Bindung (Visual Basic).
Im folgenden Codebeispiel wird veranschaulicht, wie eine Instanz 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 Klassen hinzufügen, die von der DynamicObject Klasse abgeleitet wurden. Wenn Ihre Klasse Eigenschaften definiert und die TrySetMember Methode auch außer Kraft setzt, verwendet die dynamische Sprachlaufzeit (DLR) zunächst den Sprachordner, um nach einer statischen Definition einer Eigenschaft in der Klasse zu suchen. Wenn keine solche Eigenschaft vorhanden ist, ruft das DLR die TrySetMember Methode auf.
Die DynamicObject Klasse implementiert die DLR-Schnittstelle IDynamicMetaObjectProvider, mit der Sie Instanzen der DynamicObject Klasse zwischen Sprachen teilen können, die das DLR-Interoperabilitätsmodell unterstützen. Sie können beispielsweise eine Instanz der DynamicObject Klasse in C# erstellen und dann an eine IronPython-Funktion übergeben. Weitere Informationen finden Sie unter Übersicht über dynamische Sprachlaufzeiten.
Note
Wenn Sie über ein einfaches Szenario verfügen, in dem Sie ein Objekt benötigen, das nur Mitglieder zur Laufzeit hinzufügen und entfernen kann, aber keine bestimmten Vorgänge definieren muss und keine statischen Member enthält, verwenden Sie die ExpandoObject Klasse.
Wenn Sie ein komplexeres Szenario haben, in dem Sie definieren müssen, wie dynamische Objekte am Interoperabilitätsprotokoll teilnehmen, oder sie müssen die schnelle dynamische Versandzwischenspeicherung des DLR verwalten, erstellen Sie ihre eigene Implementierung der IDynamicMetaObjectProvider Schnittstelle.
Konstruktoren
| Name | Beschreibung |
|---|---|
| DynamicObject() |
Ermöglicht abgeleiteten Typen die Initialisierung einer neuen Instanz des DynamicObject Typs. |
Methoden
| Name | Beschreibung |
|---|---|
| Equals(Object) |
Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht. (Geerbt von Object) |
| GetDynamicMemberNames() |
Gibt die Aufzählung aller dynamischen Membernamen zurück. |
| GetHashCode() |
Dient als Standardhashfunktion. (Geerbt von Object) |
| GetMetaObject(Expression) |
Stellt eine DynamicMetaObject Methode bereit, die an die dynamischen virtuellen Methoden verteilt wird. 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 Sprachimplementierer und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen. |
| GetType() |
Ruft die Type der aktuellen Instanz ab. (Geerbt von Object) |
| MemberwiseClone() |
Erstellt eine flache Kopie der aktuellen Object. (Geerbt von Object) |
| ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |
| TryBinaryOperation(BinaryOperationBinder, Object, Object) |
Stellt eine Implementierung für binäre Vorgänge bereit. Von der DynamicObject Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Vorgänge wie Addition und Multiplikation anzugeben. |
| TryConvert(ConvertBinder, Object) |
Stellt implementierung für Typkonvertierungsvorgänge bereit. Von der DynamicObject Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Vorgänge 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 für die 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 für die Verwendung in C# oder Visual Basic vorgesehen. |
| TryDeleteMember(DeleteMemberBinder) |
Stellt die Implementierung für Vorgänge bereit, die ein Objektelement löschen. Diese Methode ist nicht für die 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 Indizierungsvorgä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 anzugeben, z. B. das Abrufen eines Werts für eine Eigenschaft. |
| 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 anzugeben, z. B. das Aufrufen eines Objekts oder eines Delegaten. |
| TryInvokeMember(InvokeMemberBinder, Object[], Object) |
Stellt die Implementierung für Vorgänge bereit, die ein Element 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 durch einen 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 anzugeben, z. B. festlegen eines Werts für eine Eigenschaft. |
| TryUnaryOperation(UnaryOperationBinder, Object) |
Stellt implementierung für unäre Vorgänge 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. |