System.Dynamic.ExpandoObject osztály
Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.
Az ExpandoObject osztály lehetővé teszi a példányok tagjainak futásidőben történő hozzáadását és törlését, valamint ezen tagok értékeinek beállítását és lekérését. Ez az osztály támogatja a dinamikus kötést, amely lehetővé teszi a standard szintaxis használatát, mint az sampleObject.sampleMember
összetettebb szintaxis, például sampleObject.GetAttribute("sampleMember")
.
Az ExpandoObject
osztály implementálja a szabványos dinamikus nyelvi futtatókörnyezeti (DLR) felületet IDynamicMetaObjectProvider, amely lehetővé teszi az osztály példányainak megosztását a ExpandoObject
DLR együttműködési modellt támogató nyelvek között. Létrehozhat például egy C# osztálypéldányt ExpandoObject
, majd átadhatja azt egy IronPython függvénynek. További információ: Dynamic Language Runtime Overview and Introducing the ExpandoObject.
Az ExpandoObject
osztály a dinamikus objektumkoncepció implementálása, amely lehetővé teszi a tagok beolvasását, beállítását és meghívását. Ha olyan típusokat szeretne definiálni, amelyek saját dinamikus küldési szemantikával rendelkeznek, használja az osztályt DynamicObject . Ha meg szeretné határozni, hogy a dinamikus objektumok hogyan vesznek részt az együttműködési protokollban, és kezelni szeretné a DLR gyors dinamikus kézbesítési gyorsítótárazását, hozza létre a IDynamicMetaObjectProvider felület saját implementációját.
Példány létrehozása
A C#-ban az osztály egy példányának késői kötésének ExpandoObject
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 az ExpandoObject
osztály egy példánya.
dynamic sampleObject = new ExpandoObject();
Dim sampleObject As Object = New ExpandoObject()
Új tagok hozzáadása
Tulajdonságokat, metódusokat és eseményeket adhat hozzá az ExpandoObject
osztály példányaihoz.
Az alábbi példakód bemutatja, hogyan adhat hozzá új tulajdonságot az ExpandoObject
osztály egy példányához.
sampleObject.test = "Dynamic Property";
Console.WriteLine(sampleObject.test);
Console.WriteLine(sampleObject.test.GetType());
// This code example produces the following output:
// Dynamic Property
// System.String
sampleObject.Test = "Dynamic Property"
Console.WriteLine(sampleObject.test)
Console.WriteLine(sampleObject.test.GetType())
' This code example produces the following output:
' Dynamic Property
' System.String
A metódusok delegáltként tárolt lambdakifejezéseket jelölnek, amelyek szükség esetén meghívhatók. Az alábbi példakód bemutatja, hogyan vehet fel olyan metódust, amely növeli a dinamikus tulajdonság értékét.
sampleObject.number = 10;
sampleObject.Increment = (Action)(() => { sampleObject.number++; });
// Before calling the Increment method.
Console.WriteLine(sampleObject.number);
sampleObject.Increment();
// After calling the Increment method.
Console.WriteLine(sampleObject.number);
// This code example produces the following output:
// 10
// 11
sampleObject.Number = 10
sampleObject.Increment = Function() sampleObject.Number + 1
' Before calling the Increment method.
Console.WriteLine(sampleObject.number)
sampleObject.Increment.Invoke()
' After calling the Increment method.
Console.WriteLine(sampleObject.number)
' This code example produces the following output:
' 10
' 11
Az alábbi példakód bemutatja, hogyan adhat hozzá eseményt az ExpandoObject
osztály egy példányához.
class Program
{
static void Main(string[] args)
{
dynamic sampleObject = new ExpandoObject();
// Create a new event and initialize it with null.
sampleObject.sampleEvent = null;
// Add an event handler.
sampleObject.sampleEvent += new EventHandler(SampleHandler);
// Raise an event for testing purposes.
sampleObject.sampleEvent(sampleObject, new EventArgs());
}
// Event handler.
static void SampleHandler(object sender, EventArgs e)
{
Console.WriteLine("SampleHandler for {0} event", sender);
}
}
// This code example produces the following output:
// SampleHandler for System.Dynamic.ExpandoObject event.
Module Module1
Sub Main()
Dim sampleObject As Object = New ExpandoObject()
' Create a new event and initialize it with null.
sampleObject.sampleEvent = Nothing
' Add an event handler.
Dim handler As EventHandler = AddressOf SampleHandler
sampleObject.sampleEvent =
[Delegate].Combine(sampleObject.sampleEvent, handler)
' Raise an event for testing purposes.
sampleObject.sampleEvent.Invoke(sampleObject, New EventArgs())
End Sub
' Event handler.
Sub SampleHandler(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine("SampleHandler for {0} event", sender)
End Sub
' This code example produces the following output:
' SampleHandler for System.Dynamic.ExpandoObject event.
End Module
Továbbítás paraméterként
Az osztály példányait ExpandoObject
paraméterként is átadhatja. Vegye figyelembe, hogy ezek a példányok dinamikus objektumokként vannak kezelve c# és késő kötött objektumokként a Visual Basicben. Ez azt jelenti, hogy nem rendelkezik IntelliSense objektumtagokkal, és nem kap fordítóhibákat, amikor nem létező tagokat hív meg. Ha nem létező tagot hív meg, kivétel történik.
Az alábbi példakód bemutatja, hogyan hozhat létre és használhat metódust a tulajdonságok nevének és értékeinek nyomtatásához.
class Program
{
static void Main(string[] args)
{
dynamic employee, manager;
employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;
manager = new ExpandoObject();
manager.Name = "Allison Brown";
manager.Age = 42;
manager.TeamSize = 10;
WritePerson(manager);
WritePerson(employee);
}
private static void WritePerson(dynamic person)
{
Console.WriteLine("{0} is {1} years old.",
person.Name, person.Age);
// The following statement causes an exception
// if you pass the employee object.
// Console.WriteLine("Manages {0} people", person.TeamSize);
}
}
// This code example produces the following output:
// John Smith is 33 years old.
// Allison Brown is 42 years old.
Sub Main()
Dim employee, manager As Object
employee = New ExpandoObject()
employee.Name = "John Smith"
employee.Age = 33
manager = New ExpandoObject()
manager.Name = "Allison Brown"
manager.Age = 42
manager.TeamSize = 10
WritePerson(manager)
WritePerson(employee)
End Sub
Private Sub WritePerson(ByVal person As Object)
Console.WriteLine("{0} is {1} years old.",
person.Name, person.Age)
' The following statement causes an exception
' if you pass the employee object.
' Console.WriteLine("Manages {0} people", person.TeamSize)
End Sub
Tagok számbavétele és törlése
Az ExpandoObject
osztály megvalósítja az IDictionary<String, Object>
felületet. Ez lehetővé teszi az osztály példányához adott tagok számbavételét ExpandoObject
futásidőben. Ez akkor lehet hasznos, ha fordításkor nem tudja, hogy egy példánynak milyen tagjai lehetnek.
Az alábbi kódpélda bemutatja, hogyan helyezheti át az ExpandoObject
osztály egy példányát a IDictionary<TKey,TValue> felületre, és hogyan sorolhatja fel a példány tagjait.
dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;
foreach (var property in (IDictionary<String, Object>)employee)
{
Console.WriteLine(property.Key + ": " + property.Value);
}
// This code example produces the following output:
// Name: John Smith
// Age: 33
Dim employee As Object = New ExpandoObject()
employee.Name = "John Smith"
employee.Age = 33
For Each member In CType(employee, IDictionary(Of String, Object))
Console.WriteLine(member.Key & ": " & member.Value)
Next
' This code example produces the following output:
' Name: John Smith
' Age: 33
Az olyan nyelvekben, amelyek nem rendelkeznek a tagok törlésére szolgáló szintaxissal (például C# és Visual Basic), törölheti a tagokat úgy, hogy implicit módon a felületre IDictionary<String, Object>
adhatja a ExpandoObject
példányt, majd kulcs-érték párként törölheti a tagot. Ez az alábbi példában látható.
dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
((IDictionary<String, Object>)employee).Remove("Name");
Dim employee As Object = New ExpandoObject()
employee.Name = "John Smith"
CType(employee, IDictionary(Of String, Object)).Remove("Name")
Értesítések fogadása a tulajdonságok változásairól
Az ExpandoObject
osztály implementálja a INotifyPropertyChanged felületet, és eseményt PropertyChanged hozhat létre egy tag hozzáadása, törlése vagy módosításakor. Ez lehetővé teszi ExpandoObject
az osztály integrációját Windows megjelenítési alaprendszer (WPF) adatkötéssel és más környezetekkel, amelyek értesítést igényelnek az objektumtartalom változásairól.
Az alábbi példakód bemutatja, hogyan hozhat létre eseménykezelőt az PropertyChanged
eseményhez.
// Add "using System.ComponentModel;" line
// to the beginning of the file.
class Program
{
static void Test()
{
dynamic employee = new ExpandoObject();
((INotifyPropertyChanged)employee).PropertyChanged +=
new PropertyChangedEventHandler(HandlePropertyChanges);
employee.Name = "John Smith";
}
private static void HandlePropertyChanges(
object sender, PropertyChangedEventArgs e)
{
Console.WriteLine("{0} has changed.", e.PropertyName);
}
}
' Add "Imports System.ComponentModel" line
' to the beginning of the file.
Sub Main()
Dim employee As Object = New ExpandoObject
AddHandler CType(
employee, INotifyPropertyChanged).PropertyChanged,
AddressOf HandlePropertyChanges
employee.Name = "John Smith"
End Sub
Private Sub HandlePropertyChanges(
ByVal sender As Object, ByVal e As PropertyChangedEventArgs)
Console.WriteLine("{0} has changed.", e.PropertyName)
End Sub
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: