Kelas System.Dynamic.ExpandoObject
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
Kelas ini ExpandoObject memungkinkan Anda untuk menambahkan dan menghapus anggota instansnya pada waktu proses dan juga untuk mengatur dan mendapatkan nilai anggota ini. Kelas ini mendukung pengikatan dinamis, yang memungkinkan Anda menggunakan sintaks standar seperti sampleObject.sampleMember
alih-alih sintaks yang lebih kompleks seperti sampleObject.GetAttribute("sampleMember")
.
Kelas ini ExpandoObject
mengimplementasikan antarmuka IDynamicMetaObjectProviderDynamic Language Runtime (DLR) standar , yang memungkinkan Anda berbagi instans ExpandoObject
kelas antar bahasa yang mendukung model interoperabilitas DLR. Misalnya, Anda dapat membuat instans ExpandoObject
kelas di C# lalu meneruskannya ke fungsi IronPython. Untuk informasi selengkapnya, lihat Gambaran Umum Runtime Bahasa Dinamis dan Memperkenalkan ExpandoObject.
Kelas ExpandoObject
adalah implementasi dari konsep objek dinamis yang memungkinkan mendapatkan, mengatur, dan memanggil anggota. Jika Anda ingin menentukan jenis yang memiliki semantik pengiriman dinamis mereka sendiri, gunakan DynamicObject kelas . Jika Anda ingin menentukan bagaimana objek dinamis berpartisipasi dalam protokol interoperabilitas dan mengelola penembolokan pengiriman dinamis cepat DLR, buat implementasi IDynamicMetaObjectProvider antarmuka Anda sendiri.
Membuat instans
Di C#, untuk mengaktifkan pengikatan terlambat untuk instans ExpandoObject
kelas, Anda harus menggunakan dynamic
kata kunci. Untuk informasi selengkapnya, lihat Menggunakan Jenis dinamis.
Di Visual Basic, operasi dinamis didukung oleh pengikatan terlambat. Untuk informasi selengkapnya, lihat Pengikatan Awal dan Terlambat (Visual Basic).
Contoh kode berikut menunjukkan cara membuat instans ExpandoObject
kelas.
dynamic sampleObject = new ExpandoObject();
Dim sampleObject As Object = New ExpandoObject()
Menambahkan anggota baru
Anda dapat menambahkan properti, metode, dan peristiwa ke instans ExpandoObject
kelas.
Contoh kode berikut menunjukkan cara menambahkan properti baru ke instans ExpandoObject
kelas.
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
Metode mewakili ekspresi lambda yang disimpan sebagai delegasi, yang dapat dipanggil ketika diperlukan. Contoh kode berikut menunjukkan cara menambahkan metode yang menambah nilai properti dinamis.
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
Contoh kode berikut menunjukkan cara menambahkan peristiwa ke instans ExpandoObject
kelas.
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
Teruskan sebagai parameter
Anda dapat meneruskan ExpandoObject
instans kelas sebagai parameter. Perhatikan bahwa instans ini diperlakukan sebagai objek dinamis di C# dan objek yang terlambat terikat di Visual Basic. Ini berarti Bahwa Anda tidak memiliki IntelliSense untuk anggota objek dan Anda tidak menerima kesalahan kompilator saat Anda memanggil anggota yang tidak ada. Jika Anda memanggil anggota yang tidak ada, pengecualian terjadi.
Contoh kode berikut menunjukkan bagaimana Anda dapat membuat dan menggunakan metode untuk mencetak nama dan nilai properti.
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
Menghitung dan menghapus anggota
Kelas ExpandoObject
menerapkan antarmuka IDictionary<String, Object>
. Ini memungkinkan enumerasi anggota yang ditambahkan ke instans kelas pada ExpandoObject
waktu proses. Ini dapat berguna jika Anda tidak tahu pada waktu kompilasi apa yang mungkin dimiliki anggota instans.
Contoh kode berikut menunjukkan bagaimana Anda dapat melemparkan instans ExpandoObject
kelas ke IDictionary<TKey,TValue> antarmuka dan menghitung anggota instans.
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
Dalam bahasa yang tidak memiliki sintaks untuk menghapus anggota (seperti C# dan Visual Basic), Anda dapat menghapus anggota dengan secara implisit mentransmisikan instans ExpandoObject
ke IDictionary<String, Object>
antarmuka lalu menghapus anggota sebagai pasangan kunci/nilai. Hal ini ditunjukkan di contoh berikut.
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")
Menerima pemberitahuan perubahan properti
Kelas ExpandoObject
mengimplementasikan INotifyPropertyChanged antarmuka dan dapat menaikkan PropertyChanged peristiwa saat anggota ditambahkan, dihapus, atau dimodifikasi. Ini memungkinkan ExpandoObject
integrasi kelas dengan pengikatan data Windows Presentation Foundation (WPF) dan lingkungan lain yang memerlukan pemberitahuan tentang perubahan konten objek.
Contoh kode berikut menunjukkan cara membuat penanganan aktivitas untuk peristiwa tersebut PropertyChanged
.
// 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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk