DynamicObject Klas
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Biedt een basisklasse voor het opgeven van dynamisch gedrag tijdens runtime. Deze klasse moet worden overgenomen van; u kunt deze niet rechtstreeks instantiëren.
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
- Overname
-
DynamicObject
- Afgeleid
- Kenmerken
- Implementeringen
Voorbeelden
Stel dat u alternatieve syntaxis wilt opgeven voor het openen van waarden in een woordenlijst, zodat u sampleDictionary.Text = "Sample text" kunt schrijven in plaats van sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text" in Visual Basic). U wilt ook dat deze syntaxis niet hoofdlettergevoelig is, zodat dit sampleDictionary.Text gelijk is aan sampleDictionary.text.
In het volgende codevoorbeeld ziet u de DynamicDictionary klasse, die is afgeleid van de DynamicObject klasse. De klasse DynamicDictionary bevat een object van het type Dictionary<string, object> (Dictionary(Of String, Object) in Visual Basic) om de sleutel-waardeparen op te slaan en overschrijft de TrySetMember en TryGetMember methoden ter ondersteuning van de nieuwe syntaxis. Het biedt ook een Count eigenschap, die laat zien hoeveel dynamische eigenschappen de woordenlijst bevat.
// 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
Zie Het maken van wrappers met DynamicObject in het blog Veelgestelde vragen over C# voor meer voorbeelden.
Opmerkingen
Met de DynamicObject klasse kunt u definiëren welke bewerkingen kunnen worden uitgevoerd op dynamische objecten en hoe u deze bewerkingen uitvoert. U kunt bijvoorbeeld definiëren wat er gebeurt wanneer u een objecteigenschap probeert op te halen of in te stellen, een methode aanroept of standaard wiskundige bewerkingen uitvoert, zoals optellen en vermenigvuldigen.
Deze klasse kan handig zijn als u een handiger protocol voor een bibliotheek wilt maken. Als gebruikers van uw bibliotheek bijvoorbeeld syntaxis Scriptobj.SetProperty("Count", 1)moeten gebruiken, kunt u de mogelijkheid bieden om veel eenvoudigere syntaxis te gebruiken, zoals scriptobj.Count = 1.
U kunt geen exemplaar van de DynamicObject klasse rechtstreeks maken. Als u het dynamische gedrag wilt implementeren, wilt u mogelijk overnemen van de DynamicObject klasse en de benodigde methoden overschrijven. Als u bijvoorbeeld alleen bewerkingen nodig hebt voor het instellen en ophalen van eigenschappen, kunt u alleen de TrySetMember en TryGetMember methoden overschrijven.
Als u in C# dynamisch gedrag wilt inschakelen voor exemplaren van klassen die zijn afgeleid van de DynamicObject klasse, moet u het dynamic trefwoord gebruiken. Zie Dynamisch type gebruiken voor meer informatie.
In Visual Basic worden dynamische bewerkingen ondersteund door late binding. Zie Early and Late Binding (Visual Basic) voor meer informatie.
In het volgende codevoorbeeld ziet u hoe u een exemplaar maakt van een klasse die is afgeleid van de DynamicObject klasse.
public class SampleDynamicObject : DynamicObject {}
//...
dynamic sampleObject = new SampleDynamicObject ();
Public Class SampleDynamicObject
Inherits DynamicObject
'...
Dim sampleObject As Object = New SampleDynamicObject()
U kunt ook uw eigen leden toevoegen aan klassen die zijn afgeleid van de DynamicObject klasse. Als uw klasse eigenschappen definieert en ook de TrySetMember methode overschrijft, gebruikt de DYNAMIC Language Runtime (DLR) eerst de taalbinding om te zoeken naar een statische definitie van een eigenschap in de klasse. Als er geen dergelijke eigenschap is, roept de DLR de TrySetMember methode aan.
De DynamicObject klasse implementeert de DLR-interface IDynamicMetaObjectProvider, waarmee u exemplaren van de DynamicObject klasse kunt delen tussen talen die ondersteuning bieden voor het DLR-interoperabiliteitsmodel. U kunt bijvoorbeeld een exemplaar van de DynamicObject klasse in C# maken en deze vervolgens doorgeven aan een IronPython-functie. Zie Het overzicht van Dynamic Language Runtime voor meer informatie.
Note
Als u een eenvoudig scenario hebt waarin u een object nodig hebt dat alleen leden tijdens runtime kan toevoegen en verwijderen, maar die geen specifieke bewerkingen hoeft te definiëren en geen statische leden heeft, gebruikt u de ExpandoObject klasse.
Als u een geavanceerder scenario hebt waarin u moet definiëren hoe dynamische objecten deelnemen aan het interoperabiliteitsprotocol, of als u DLR snelle dynamische dispatchcaching moet beheren, maakt u uw eigen implementatie van de IDynamicMetaObjectProvider interface.
Constructors
| Name | Description |
|---|---|
| DynamicObject() |
Hiermee kunnen afgeleide typen een nieuw exemplaar van het DynamicObject type initialiseren. |
Methoden
| Name | Description |
|---|---|
| Equals(Object) |
Bepaalt of het opgegeven object gelijk is aan het huidige object. (Overgenomen van Object) |
| GetDynamicMemberNames() |
Retourneert de opsomming van alle dynamische lidnamen. |
| GetHashCode() |
Fungeert als de standaardhashfunctie. (Overgenomen van Object) |
| GetMetaObject(Expression) |
Biedt een DynamicMetaObject verzending naar de dynamische virtuele methoden. Het object kan worden ingekapseld in een ander DynamicMetaObject object om aangepast gedrag te bieden voor afzonderlijke acties. Deze methode ondersteunt de Dynamic Language Runtime-infrastructuur voor taaluitvoerders en is niet bedoeld om rechtstreeks vanuit uw code te worden gebruikt. |
| GetType() |
Hiermee haalt u de Type huidige instantie op. (Overgenomen van Object) |
| MemberwiseClone() |
Hiermee maakt u een ondiepe kopie van de huidige Object. (Overgenomen van Object) |
| ToString() |
Retourneert een tekenreeks die het huidige object vertegenwoordigt. (Overgenomen van Object) |
| TryBinaryOperation(BinaryOperationBinder, Object, Object) |
Biedt implementatie voor binaire bewerkingen. Klassen die zijn afgeleid van de DynamicObject klasse kunnen deze methode overschrijven om dynamisch gedrag op te geven voor bewerkingen zoals optellen en vermenigvuldigen. |
| TryConvert(ConvertBinder, Object) |
Biedt implementatie voor typeconversiebewerkingen. Klassen die zijn afgeleid van de DynamicObject klasse kunnen deze methode overschrijven om dynamisch gedrag op te geven voor bewerkingen die een object van het ene type naar het andere converteren. |
| TryCreateInstance(CreateInstanceBinder, Object[], Object) |
Biedt de implementatie voor bewerkingen waarmee een nieuw exemplaar van een dynamisch object wordt geïnitialiseerd. Deze methode is niet bedoeld voor gebruik in C# of Visual Basic. |
| TryDeleteIndex(DeleteIndexBinder, Object[]) |
Biedt de implementatie voor bewerkingen die een object per index verwijderen. Deze methode is niet bedoeld voor gebruik in C# of Visual Basic. |
| TryDeleteMember(DeleteMemberBinder) |
Biedt de implementatie voor bewerkingen waarmee een objectlid wordt verwijderd. Deze methode is niet bedoeld voor gebruik in C# of Visual Basic. |
| TryGetIndex(GetIndexBinder, Object[], Object) |
Biedt de implementatie voor bewerkingen die een waarde ophalen op basis van index. Klassen die zijn afgeleid van de DynamicObject klasse kunnen deze methode overschrijven om dynamisch gedrag op te geven voor indexeringsbewerkingen. |
| TryGetMember(GetMemberBinder, Object) |
Biedt de implementatie voor bewerkingen die lidwaarden ophalen. Klassen die zijn afgeleid van de DynamicObject klasse kunnen deze methode overschrijven om dynamisch gedrag op te geven voor bewerkingen zoals het ophalen van een waarde voor een eigenschap. |
| TryInvoke(InvokeBinder, Object[], Object) |
Biedt de implementatie voor bewerkingen die een object aanroepen. Klassen die zijn afgeleid van de DynamicObject klasse kunnen deze methode overschrijven om dynamisch gedrag op te geven voor bewerkingen zoals het aanroepen van een object of een gemachtigde. |
| TryInvokeMember(InvokeMemberBinder, Object[], Object) |
Biedt de implementatie voor bewerkingen die een lid aanroepen. Klassen die zijn afgeleid van de DynamicObject klasse kunnen deze methode overschrijven om dynamisch gedrag op te geven voor bewerkingen zoals het aanroepen van een methode. |
| TrySetIndex(SetIndexBinder, Object[], Object) |
Biedt de implementatie voor bewerkingen die een waarde per index instellen. Klassen die zijn afgeleid van de DynamicObject klasse kunnen deze methode overschrijven om dynamisch gedrag op te geven voor bewerkingen die toegang hebben tot objecten door een opgegeven index. |
| TrySetMember(SetMemberBinder, Object) |
Biedt de implementatie voor bewerkingen die lidwaarden instellen. Klassen die zijn afgeleid van de DynamicObject klasse kunnen deze methode overschrijven om dynamisch gedrag op te geven voor bewerkingen, zoals het instellen van een waarde voor een eigenschap. |
| TryUnaryOperation(UnaryOperationBinder, Object) |
Biedt implementatie voor unaire bewerkingen. Klassen die zijn afgeleid van de DynamicObject klasse kunnen deze methode overschrijven om dynamisch gedrag op te geven voor bewerkingen zoals negatie, incrementeel of verlagen. |