DynamicObject Osztály
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Alaposztályt biztosít a dinamikus viselkedés futásidőben történő megadásához. Ezt az osztályt örökölni kell; közvetlenül nem példányosíthatja.
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
- Öröklődés
-
DynamicObject
- Származtatott
- Attribútumok
- Megvalósítás
Példák
Tegyük fel, hogy alternatív szintaxist szeretne adni egy szótár értékeinek eléréséhez, hogy ahelyett, hogy sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text" Visual Basic) írna, sampleDictionary.Text = "Sample text" írhat. Azt is szeretné, hogy ez a szintaxis a kis- és nagybetűk érzéketlenek legyenek, így sampleDictionary.Text ez egyenértékű a következőkkel sampleDictionary.text.
Az alábbi példakód az DynamicDictionary osztályból DynamicObject származtatott osztályt mutatja be. A DynamicDictionary osztály a Dictionary<string, object> típusú (Dictionary(Of String, Object) Visual Basic) objektumot tartalmazza a kulcs-érték párok tárolásához, és felülbírálja a TrySetMember és TryGetMember metódust az új szintaxis támogatásához. Emellett egy tulajdonságot Count is biztosít, amely azt mutatja, hogy a szótár hány dinamikus tulajdonságot tartalmaz.
// 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
További példákért lásd : Burkolók létrehozása DynamicObject használatával a C# gyakori kérdések blogján.
Megjegyzések
Az DynamicObject osztály segítségével meghatározhatja, hogy mely műveletek hajthatók végre dinamikus objektumokon, és hogyan hajthatja végre ezeket a műveleteket. Meghatározhatja például, hogy mi történik, ha objektumtulajdonságokat próbál meg lekérni vagy beállítani, metódust hív meg, vagy szabványos matematikai műveleteket hajt végre, például összeadást és szorzást.
Ez az osztály akkor lehet hasznos, ha kényelmesebb protokollt szeretne létrehozni egy tárhoz. Ha például a tár felhasználóinak szintaxist Scriptobj.SetProperty("Count", 1)kell használniuk, akkor sokkal egyszerűbb szintaxist is használhatnak, például scriptobj.Count = 1.
Az osztály egy példányát DynamicObject közvetlenül nem hozhatja létre. A dinamikus viselkedés implementálásához érdemes lehet örökölni az osztálytól, és felülbírálni a DynamicObject szükséges metódusokat. Ha például csak a tulajdonságok beállításához és lekéréséhez szükséges műveletekre van szüksége, felülbírálhatja csak a metódusokat és TryGetMember a TrySetMember metódusokat.
A C#-ban az osztályból DynamicObject származtatott osztályok példányainak dinamikus viselkedésének engedélyezéséhez a kulcsszót dynamic kell használnia. További információt a Dinamikus típus használata című témakörben talál.
A Visual Basicben a dinamikus műveleteket késői kötés támogatja. További információ: Korai és késői kötés (Visual Basic).
Az alábbi példakód bemutatja, hogyan hozható létre egy osztály egy példánya, amely az DynamicObject osztályból származik.
public class SampleDynamicObject : DynamicObject {}
//...
dynamic sampleObject = new SampleDynamicObject ();
Public Class SampleDynamicObject
Inherits DynamicObject
'...
Dim sampleObject As Object = New SampleDynamicObject()
Saját tagokat is hozzáadhat az DynamicObject osztályból származó osztályokhoz. Ha az osztály tulajdonságokat határoz meg, és felülbírálja a TrySetMember metódust is, a dinamikus nyelvi futtatókörnyezet (DLR) először a nyelvi kötőanyagot használja egy tulajdonság statikus definíciójának kereséséhez az osztályban. Ha nincs ilyen tulajdonság, a DLR meghívja a metódust TrySetMember .
Az DynamicObject osztály implementálja a DLR felületet IDynamicMetaObjectProvider, amely lehetővé teszi az osztály példányainak megosztását a DynamicObject DLR együttműködési modellt támogató nyelvek között. Létrehozhat például egy C# osztálypéldányt DynamicObject , majd átadhatja azt egy IronPython függvénynek. További információ: Dinamikus nyelvi futtatókörnyezet áttekintése.
Megjegyzés:
Ha van egy egyszerű forgatókönyve, amelyben olyan objektumra van szüksége, amely csak futásidőben tud tagokat hozzáadni és eltávolítani, de nem kell meghatározott műveleteket meghatároznia, és nincsenek statikus tagjai, használja az osztályt ExpandoObject .
Ha van egy fejlettebb forgatókönyve, amelyben meg kell határoznia, hogy a dinamikus objektumok hogyan vesznek részt az együttműködési protokollban, vagy a DLR gyors dinamikus kézbesítési gyorsítótárazását kell kezelnie, hozza létre a IDynamicMetaObjectProvider felület saját implementációját.
Konstruktorok
| Name | Description |
|---|---|
| DynamicObject() |
Engedélyezi a származtatott típusok számára a típus új példányának inicializálását DynamicObject . |
Metódusok
| Name | Description |
|---|---|
| Equals(Object) |
Meghatározza, hogy a megadott objektum egyenlő-e az aktuális objektummal. (Öröklődés forrása Object) |
| GetDynamicMemberNames() |
Az összes dinamikus tagnév számbavételét adja vissza. |
| GetHashCode() |
Ez az alapértelmezett kivonatoló függvény. (Öröklődés forrása Object) |
| GetMetaObject(Expression) |
DynamicMetaObject A dinamikus virtuális metódusokhoz küldi azokat. Az objektum beágyazható egy másikba DynamicMetaObject , hogy egyéni viselkedést biztosítson az egyes műveletekhez. Ez a módszer támogatja a nyelvi implementálók dinamikus nyelvi futtatókörnyezeti infrastruktúráját, és nem közvetlenül a kódból való használatra szolgál. |
| GetType() |
Lekéri az Type aktuális példányt. (Öröklődés forrása Object) |
| MemberwiseClone() |
Az aktuális Objectpéldány sekély másolatát hozza létre. (Öröklődés forrása Object) |
| ToString() |
Az aktuális objektumot jelképező sztringet ad vissza. (Öröklődés forrása Object) |
| TryBinaryOperation(BinaryOperationBinder, Object, Object) |
Bináris műveletek implementálását biztosítja. Az osztályból származó osztályok felülbírálhatják ezt a DynamicObject metódust, hogy dinamikus viselkedést adjanak meg az olyan műveletekhez, mint az összeadás és a szorzás. |
| TryConvert(ConvertBinder, Object) |
Implementációt biztosít a típuskonvertálási műveletekhez. Az osztályból származó osztályok felülbírálhatják ezt a DynamicObject metódust az objektumok egyik típusból a másikba konvertáló műveletek dinamikus viselkedésének meghatározásához. |
| TryCreateInstance(CreateInstanceBinder, Object[], Object) |
A dinamikus objektumok új példányát inicializáló műveletek implementációját biztosítja. Ez a módszer nem C# vagy Visual Basic használatára szolgál. |
| TryDeleteIndex(DeleteIndexBinder, Object[]) |
Olyan műveletek implementálását biztosítja, amelyek index alapján törölnek egy objektumot. Ez a módszer nem C# vagy Visual Basic használatára szolgál. |
| TryDeleteMember(DeleteMemberBinder) |
Az objektumtagot törlő műveletek implementációját biztosítja. Ez a módszer nem C# vagy Visual Basic használatára szolgál. |
| TryGetIndex(GetIndexBinder, Object[], Object) |
Olyan műveletek implementálását biztosítja, amelyek index alapján kapnak értéket. Az osztályból származó osztályok felülbírálhatják ezt a DynamicObject metódust, hogy dinamikus viselkedést adjanak meg az indexelési műveletekhez. |
| TryGetMember(GetMemberBinder, Object) |
A tagértékeket lekérő műveletek implementációját biztosítja. Az osztályból származó osztályok felülbírálhatják ezt a DynamicObject metódust, hogy dinamikus viselkedést adjanak meg az olyan műveletekhez, mint például egy tulajdonság értékének lekérése. |
| TryInvoke(InvokeBinder, Object[], Object) |
Az objektumot meghívó műveletek implementációját biztosítja. Az osztályból származó osztályok felülbírálhatják ezt a DynamicObject metódust, hogy dinamikus viselkedést adjanak meg olyan műveletekhez, mint például egy objektum vagy egy meghatalmazott meghívása. |
| TryInvokeMember(InvokeMemberBinder, Object[], Object) |
A tagot meghívó műveletek implementációját biztosítja. Az osztályból származó osztályok felülbírálhatják ezt a DynamicObject metódust, hogy dinamikus viselkedést adjanak meg az olyan műveletekhez, mint a metódus meghívása. |
| TrySetIndex(SetIndexBinder, Object[], Object) |
Olyan műveletek implementálását biztosítja, amelyek index alapján állítanak be értéket. Az osztályból származó osztályok felülbírálhatják ezt a DynamicObject metódust, hogy dinamikus viselkedést adjanak meg az objektumokhoz adott index által hozzáférő műveletekhez. |
| TrySetMember(SetMemberBinder, Object) |
A tagértékeket beállítva műveletek implementációját biztosítja. Az osztályból származó osztályok felülbírálhatják ezt a DynamicObject metódust, hogy dinamikus viselkedést adjanak meg a műveletekhez, például egy tulajdonság értékének beállításához. |
| TryUnaryOperation(UnaryOperationBinder, Object) |
Implementációt biztosít a nem szükséges műveletekhez. Az osztályból származó osztályok felülbírálhatják ezt a DynamicObject metódust, hogy dinamikus viselkedést adjanak meg az olyan műveletekhez, mint a negáció, a növekmény vagy a decrement. |