Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Objek dinamis mengekspos anggota seperti properti dan metode saat durasi, bukan pada waktu kompilasi. Ini memungkinkan Anda membuat objek untuk bekerja dengan struktur yang tidak cocok dengan jenis atau format statik. Misalnya, Anda dapat menggunakan objek dinamis untuk mereferensikan Model Objek Dokumen (DOM) HTML, yang dapat berisi kombinasi elemen dan atribut markup HTML yang valid. Karena setiap dokumen HTML adalah unik, anggota untuk dokumen HTML tertentu ditentukan saat durasi. Metode umum untuk mereferensikan atribut elemen HTML adalah dengan meneruskan nama atribut ke metode GetProperty
elemen. Untuk mereferensikan atribut id
dari elemen HTML <div id="Div1">
, Anda terlebih dahulu mendapatkan referensi ke elemen <div>
, kemudian menggunakan divElement.GetProperty("id")
. Jika Anda menggunakan objek dinamis, Anda dapat mereferensikan atribut id
sebagai divElement.id
.
Objek dinamis juga memberikan akses mudah ke bahasa dinamis seperti IronPython dan IronRuby. Anda dapat menggunakan objek dinamis untuk merujuk ke skrip dinamis yang ditafsirkan saat durasi.
Anda mereferensikan objek dinamis dengan menggunakan pengikatan akhir. Anda menentukan jenis objek yang terlambat terikat sebagai Object
. Untuk informasi selengkapnya, lihat [Pengikatan Awal dan Terlambat.
Anda dapat membuat objek dinamis kustom dengan menggunakan kelas di namespace layanan System.Dynamic. Misalnya, Anda dapat membuat ExpandoObject dan menentukan anggota objek tersebut saat durasi. Anda juga dapat membuat jenis Anda sendiri yang mewarisi kelas DynamicObject. Anda kemudian dapat mengambil alih anggota kelas DynamicObject untuk memberikan fungsionalitas dinamis run-time.
Artikel ini berisi dua panduan independen:
Membuat objek kustom yang secara dinamis mengekspos isi file teks sebagai properti objek.
Membuat proyek yang menggunakan pustaka
IronPython
.
Anda dapat melakukan salah satu atau keduanya, dan jika Anda melakukan keduanya, urutannya tidak masalah.
Prasyarat
- Visual Studio 2019 versi 16.9 atau versi yang lebih baru dengan beban kerja pengembangan desktop .NET terinstal. SDK .NET 5 diinstal secara otomatis saat Anda memilih beban kerja ini.
Catatan
Komputer Anda mungkin memperlihatkan nama atau lokasi yang berbeda untuk beberapa elemen antarmuka pengguna Visual Studio dalam petunjuk berikut. Edisi Visual Studio yang Anda miliki dan setelan yang Anda gunakan menentukan elemen-elemen ini. Untuk informasi selengkapnya, lihat Mempersonalisasi IDE.
- Untuk panduan kedua, instal IronPython untuk .NET. Buka halaman Unduhan untuk mendapatkan versi terbaru.
Membuat Objek Dinamis Kustom
Panduan pertama menentukan objek dinamis kustom yang mencari isi file teks. Properti dinamis menentukan teks yang akan dicari. Misalnya, jika kode panggilan menentukan dynamicFile.Sample
, kelas dinamis mengembalikan daftar string generik yang berisi semua baris dari file yang dimulai dengan "Sampel". Pencarian tidak peka huruf besar/kecil. Kelas dinamis juga mendukung dua argumen opsional. Argumen pertama adalah nilai enum opsi pencarian yang menentukan bahwa kelas dinamis harus mencari kecocokan di awal baris, akhir baris, atau di mana pun dalam baris. Argumen kedua menentukan bahwa kelas dinamis harus memangkas spasi awal dan akhir dari setiap baris sebelum mencari. Misalnya, jika kode panggilan menentukan dynamicFile.Sample(StringSearchOption.Contains)
, kelas dinamis mencari "Sampel" di mana pun dalam satu baris. Jika kode panggilan menentukan dynamicFile.Sample(StringSearchOption.StartsWith, false)
, kelas dinamis mencari "Sampel" di awal setiap baris, dan tidak menghapus spasi awal dan akhir. Perilaku default kelas dinamis adalah mencari kecocokan di awal setiap baris dan menghapus spasi awal dan akhir.
Untuk membuat kelas dinamis kustom
Mulai Visual Studio.
Pilih Buat proyek baru.
Dalam dialog Buat proyek baru, pilih Visual Basic, pilih Aplikasi Konsol, lalu pilih Berikutnya.
Dalam dialog Konfigurasikan proyek baru Anda, masukkan
DynamicSample
untuk Nama proyek, lalu pilih Berikutnya.Dalam dialog Informasi tambahan, pilih .NET 5.0 (Saat ini) untuk Kerangka Kerja Target, lalu pilih Buat.
Proyek baru telah dibuat.
Di Penjelajah Solusi, klik kanan proyek DynamicSample dan pilih Tambahkan>Kelas. Dalam kotak Nama, ketik
ReadOnlyFile
, lalu pilih Tambahkan.File baru ditambahkan yang berisi kelas ReadOnlyFile.
Di bagian atas file ReadOnlyFile.cs atau ReadOnlyFile.vb, tambahkan kode berikut untuk mengimpor namespace layanan System.IO dan System.Dynamic.
Imports System.IO Imports System.Dynamic
Objek dinamis kustom menggunakan enum untuk menentukan kriteria pencarian. Sebelum pernyataan kelas, tambahkan definisi enum berikut.
Public Enum StringSearchOption StartsWith Contains EndsWith End Enum
Perbarui pernyataan kelas untuk mewarisi kelas
DynamicObject
, seperti yang ditunjukkan pada contoh kode berikut.Public Class ReadOnlyFile Inherits DynamicObject
Tambahkan kode berikut ke kelas
ReadOnlyFile
untuk menentukan bidang privat untuk jalur file dan konstruktor untuk kelasReadOnlyFile
.' Store the path to the file and the initial line count value. Private p_filePath As String ' Public constructor. Verify that file exists and store the path in ' the private variable. Public Sub New(ByVal filePath As String) If Not File.Exists(filePath) Then Throw New Exception("File path does not exist.") End If p_filePath = filePath End Sub
Menambahkan metode
GetPropertyValue
berikut ke kelasReadOnlyFile
. MetodeGetPropertyValue
mengambil, sebagai input, kriteria pencarian dan mengembalikan baris dari file teks yang cocok dengan kriteria pencarian tersebut. Metode dinamis yang disediakan oleh kelasReadOnlyFile
memanggil metodeGetPropertyValue
untuk mengambil hasil masing-masing.Public Function GetPropertyValue(ByVal propertyName As String, Optional ByVal StringSearchOption As StringSearchOption = StringSearchOption.StartsWith, Optional ByVal trimSpaces As Boolean = True) As List(Of String) Dim sr As StreamReader = Nothing Dim results As New List(Of String) Dim line = "" Dim testLine = "" Try sr = New StreamReader(p_filePath) While Not sr.EndOfStream line = sr.ReadLine() ' Perform a case-insensitive search by using the specified search options. testLine = UCase(line) If trimSpaces Then testLine = Trim(testLine) Select Case StringSearchOption Case StringSearchOption.StartsWith If testLine.StartsWith(UCase(propertyName)) Then results.Add(line) Case StringSearchOption.Contains If testLine.Contains(UCase(propertyName)) Then results.Add(line) Case StringSearchOption.EndsWith If testLine.EndsWith(UCase(propertyName)) Then results.Add(line) End Select End While Catch ' Trap any exception that occurs in reading the file and return Nothing. results = Nothing Finally If sr IsNot Nothing Then sr.Close() End Try Return results End Function
Setelah metode
GetPropertyValue
, tambahkan kode berikut untuk mengganti metode TryGetMember dari kelas DynamicObject. Metode TryGetMember dipanggil saat anggota kelas dinamis diminta dan tidak ada argumen yang ditentukan. Argumenbinder
berisi informasi tentang anggota yang direferensikan, dan argumenresult
mereferensikan hasil yang dikembalikan untuk anggota yang ditentukan. Metode TryGetMember mengembalikan nilai Boolean yang mengembalikantrue
jika anggota yang diminta ada; jika tidak, metode tersebut mengembalikanfalse
.' Implement the TryGetMember method of the DynamicObject class for dynamic member calls. Public Overrides Function TryGetMember(ByVal binder As GetMemberBinder, ByRef result As Object) As Boolean result = GetPropertyValue(binder.Name) Return If(result Is Nothing, False, True) End Function
Setelah metode
TryGetMember
, tambahkan kode berikut untuk mengganti metode TryInvokeMember dari kelas DynamicObject. Metode TryInvokeMember dipanggil saat anggota kelas dinamis diminta dengan argumen. Argumenbinder
berisi informasi tentang anggota yang direferensikan, dan argumenresult
mereferensikan hasil yang dikembalikan untuk anggota yang ditentukan. Argumenargs
berisi array argumen yang diteruskan ke anggota. Metode TryInvokeMember mengembalikan nilai Boolean yang mengembalikantrue
jika anggota yang diminta ada; jika tidak, metode tersebut mengembalikanfalse
.Versi kustom dari metode
TryInvokeMember
mengharapkan argumen pertama berupa nilai dari enumStringSearchOption
yang Anda tentukan di langkah sebelumnya. MetodeTryInvokeMember
mengharapkan argumen kedua menjadi nilai Boolean. Jika satu atau kedua argumen adalah nilai yang valid, argumen tersebut diteruskan ke metodeGetPropertyValue
untuk mengambil hasilnya.' Implement the TryInvokeMember method of the DynamicObject class for ' dynamic member calls that have arguments. Public Overrides Function TryInvokeMember(ByVal binder As InvokeMemberBinder, ByVal args() As Object, ByRef result As Object) As Boolean Dim StringSearchOption As StringSearchOption = StringSearchOption.StartsWith Dim trimSpaces = True Try If args.Length > 0 Then StringSearchOption = CType(args(0), StringSearchOption) Catch Throw New ArgumentException("StringSearchOption argument must be a StringSearchOption enum value.") End Try Try If args.Length > 1 Then trimSpaces = CType(args(1), Boolean) Catch Throw New ArgumentException("trimSpaces argument must be a Boolean value.") End Try result = GetPropertyValue(binder.Name, StringSearchOption, trimSpaces) Return If(result Is Nothing, False, True) End Function
Simpan dan tutup file.
Untuk membuat file teks sampel
Di Penjelajah Solusi, klik kanan proyek DynamicSample dan pilih Tambahkan>Item Baru. Di panel Templat Terinstal, pilih Umum, lalu pilih templat File Teks. Biarkan nama default TextFile1.txt dalam kotak Nama, lalu klik Tambahkan. File teks baru ditambahkan ke proyek.
Salin teks berikut ke file TextFile1.txt.
List of customers and suppliers Supplier: Lucerne Publishing (https://www.lucernepublishing.com/) Customer: Preston, Chris Customer: Hines, Patrick Customer: Cameron, Maria Supplier: Graphic Design Institute (https://www.graphicdesigninstitute.com/) Supplier: Fabrikam, Inc. (https://www.fabrikam.com/) Customer: Seubert, Roxanne Supplier: Proseware, Inc. (http://www.proseware.com/) Customer: Adolphi, Stephan Customer: Koch, Paul
Simpan dan tutup file.
Untuk membuat aplikasi sampel yang menggunakan objek dinamis kustom
Di Penjelajah Solusi, klik dua kali file Program.vb.
Tambahkan kode berikut ke prosedur
Main
untuk membuat instans kelasReadOnlyFile
untuk file TextFile1.txt. Kode menggunakan pengikatan akhir untuk memanggil anggota dinamis dan mengambil baris teks yang berisi string "Pelanggan".Dim rFile As Object = New ReadOnlyFile("..\..\..\TextFile1.txt") For Each line In rFile.Customer Console.WriteLine(line) Next Console.WriteLine("----------------------------") For Each line In rFile.Customer(StringSearchOption.Contains, True) Console.WriteLine(line) Next
Simpan file dan tekan Ctrl+F5 untuk membuat dan menjalankan aplikasi.
Memanggil pustaka bahasa dinamis
Panduan berikut membuat proyek yang mengakses pustaka yang ditulis dalam bahasa dinamis IronPython.
Untuk membuat kelas dinamis kustom
Di Visual Studio, pilih File>Baru>Proyek.
Dalam dialog Buat proyek baru, pilih Visual Basic, pilih Aplikasi Konsol, lalu pilih Berikutnya.
Dalam dialog Konfigurasikan proyek baru Anda, masukkan
DynamicIronPythonSample
untuk Nama proyek, lalu pilih Berikutnya.Dalam dialog Informasi tambahan, pilih .NET 5.0 (Saat ini) untuk Kerangka Kerja Target, lalu pilih Buat.
Proyek baru telah dibuat.
Instal paket NuGet IronPython.
Edit file Program.vb.
Di bagian atas file, tambahkan kode berikut untuk mengimpor namespace layanan
Microsoft.Scripting.Hosting
danIronPython.Hosting
dari pustaka IronPython dan namespace layananSystem.Linq
.Imports Microsoft.Scripting.Hosting Imports IronPython.Hosting Imports System.Linq
Dalam metode Utama, tambahkan kode berikut untuk membuat objek
Microsoft.Scripting.Hosting.ScriptRuntime
baru untuk menghosting pustaka IronPython. ObjekScriptRuntime
memuat modul pustaka IronPython random.py.' Set the current directory to the IronPython libraries. System.IO.Directory.SetCurrentDirectory( Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) & "\IronPython 2.7\Lib") ' Create an instance of the random.py IronPython library. Console.WriteLine("Loading random.py") Dim py = Python.CreateRuntime() Dim random As Object = py.UseFile("random.py") Console.WriteLine("random.py loaded.")
Setelah kode untuk memuat modul random.py, tambahkan kode berikut untuk membuat array bilangan bulat. Array diteruskan ke metode
shuffle
dari modul random.py, yang secara acak mengurutkan nilai dalam array.' Initialize an enumerable set of integers. Dim items = Enumerable.Range(1, 7).ToArray() ' Randomly shuffle the array of integers by using IronPython. For i = 0 To 4 random.shuffle(items) For Each item In items Console.WriteLine(item) Next Console.WriteLine("-------------------") Next
Simpan file dan tekan Ctrl+F5 untuk membuat dan menjalankan aplikasi.