Bagikan melalui


Panduan: Membuat dan Menggunakan Objek Dinamis di Visual Basic

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

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.

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

  1. Mulai Visual Studio.

  2. Pilih Buat proyek baru.

  3. Dalam dialog Buat proyek baru, pilih Visual Basic, pilih Aplikasi Konsol, lalu pilih Berikutnya.

  4. Dalam dialog Konfigurasikan proyek baru Anda, masukkan DynamicSample untuk Nama proyek, lalu pilih Berikutnya.

  5. Dalam dialog Informasi tambahan, pilih .NET 5.0 (Saat ini) untuk Kerangka Kerja Target, lalu pilih Buat.

    Proyek baru telah dibuat.

  6. 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.

  7. 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
    
  8. Objek dinamis kustom menggunakan enum untuk menentukan kriteria pencarian. Sebelum pernyataan kelas, tambahkan definisi enum berikut.

    Public Enum StringSearchOption
        StartsWith
        Contains
        EndsWith
    End Enum
    
  9. Perbarui pernyataan kelas untuk mewarisi kelas DynamicObject, seperti yang ditunjukkan pada contoh kode berikut.

    Public Class ReadOnlyFile
        Inherits DynamicObject
    
  10. Tambahkan kode berikut ke kelas ReadOnlyFile untuk menentukan bidang privat untuk jalur file dan konstruktor untuk kelas ReadOnlyFile.

    ' 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
    
  11. Menambahkan metode GetPropertyValue berikut ke kelas ReadOnlyFile. Metode GetPropertyValue mengambil, sebagai input, kriteria pencarian dan mengembalikan baris dari file teks yang cocok dengan kriteria pencarian tersebut. Metode dinamis yang disediakan oleh kelas ReadOnlyFile memanggil metode GetPropertyValue 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
    
  12. 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. Argumen binder berisi informasi tentang anggota yang direferensikan, dan argumen result mereferensikan hasil yang dikembalikan untuk anggota yang ditentukan. Metode TryGetMember mengembalikan nilai Boolean yang mengembalikan true jika anggota yang diminta ada; jika tidak, metode tersebut mengembalikan false.

    ' 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
    
  13. Setelah metode TryGetMember, tambahkan kode berikut untuk mengganti metode TryInvokeMember dari kelas DynamicObject. Metode TryInvokeMember dipanggil saat anggota kelas dinamis diminta dengan argumen. Argumen binder berisi informasi tentang anggota yang direferensikan, dan argumen result mereferensikan hasil yang dikembalikan untuk anggota yang ditentukan. Argumen args berisi array argumen yang diteruskan ke anggota. Metode TryInvokeMember mengembalikan nilai Boolean yang mengembalikan true jika anggota yang diminta ada; jika tidak, metode tersebut mengembalikan false.

    Versi kustom dari metode TryInvokeMember mengharapkan argumen pertama berupa nilai dari enum StringSearchOption yang Anda tentukan di langkah sebelumnya. Metode TryInvokeMember mengharapkan argumen kedua menjadi nilai Boolean. Jika satu atau kedua argumen adalah nilai yang valid, argumen tersebut diteruskan ke metode GetPropertyValue 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
    
  14. Simpan dan tutup file.

Untuk membuat file teks sampel

  1. 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.

  2. 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
    
  3. Simpan dan tutup file.

Untuk membuat aplikasi sampel yang menggunakan objek dinamis kustom

  1. Di Penjelajah Solusi, klik dua kali file Program.vb.

  2. Tambahkan kode berikut ke prosedur Main untuk membuat instans kelas ReadOnlyFile 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
    
  3. 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

  1. Di Visual Studio, pilih File>Baru>Proyek.

  2. Dalam dialog Buat proyek baru, pilih Visual Basic, pilih Aplikasi Konsol, lalu pilih Berikutnya.

  3. Dalam dialog Konfigurasikan proyek baru Anda, masukkan DynamicIronPythonSample untuk Nama proyek, lalu pilih Berikutnya.

  4. Dalam dialog Informasi tambahan, pilih .NET 5.0 (Saat ini) untuk Kerangka Kerja Target, lalu pilih Buat.

    Proyek baru telah dibuat.

  5. Instal paket NuGet IronPython.

  6. Edit file Program.vb.

  7. Di bagian atas file, tambahkan kode berikut untuk mengimpor namespace layanan Microsoft.Scripting.Hosting dan IronPython.Hosting dari pustaka IronPython dan namespace layanan System.Linq.

    Imports Microsoft.Scripting.Hosting
    Imports IronPython.Hosting
    Imports System.Linq
    
  8. Dalam metode Utama, tambahkan kode berikut untuk membuat objek Microsoft.Scripting.Hosting.ScriptRuntime baru untuk menghosting pustaka IronPython. Objek ScriptRuntime 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.")
    
  9. 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
    
  10. Simpan file dan tekan Ctrl+F5 untuk membuat dan menjalankan aplikasi.

Lihat juga