Bagikan melalui


Pemanggilan Properti atau Metode Menggunakan Nama String (Visual Basic)

Dalam kebanyakan kasus, Anda dapat menemukan properti dan metode objek pada waktu desain, dan menulis kode untuk menghandelnya. Akan tetapi, dalam beberapa kasus Anda mungkin tidak mengetahui properti dan metode objek terlebih dahulu, atau Anda mungkin hanya menginginkan fleksibilitas pengaktifan pengguna akhir untuk menentukan properti atau menjalankan metode pada run time.

Fungsi CallByName

Anggap saja, misalnya, aplikasi klien yang mengevaluasi ekspresi dimasukkan oleh pengguna dengan meneruskan operator ke komponen COM. Anggap saja Anda terus menambahkan fungsi baru ke komponen yang memerlukan operator baru. Ketika Anda menggunakan teknik akses objek standar, Anda harus mengompilasi ulang dan mendistribusikan kembali aplikasi klien sebelum dapat menggunakan operator baru. Untuk menghindari hal ini, Anda dapat menggunakan fungsi CallByName untuk meneruskan operator baru sebagai string, tanpa mengubah aplikasi.

Fungsi CallByName memungkinkan Anda menggunakan string untuk menentukan properti atau metode pada run time. Tanda tangan untuk fungsi CallByName akan terlihat seperti ini:

Hasil = CallByName (Objek, ProcedureName, CallType, Argumen())

Argumen pertama, Objek, mengambil nama objek yang ingin Anda tindak lanjuti. Argumen ProcedureName mengambil string yang berisi nama metode atau prosedur properti yang akan dipanggil. Argumen CallType mengambil konstanta yang mewakili jenis prosedur yang akan dipanggil: metode (Microsoft.VisualBasic.CallType.Method), bacaan properti (Microsoft.VisualBasic.CallType.Get), atau set properti (Microsoft.VisualBasic.CallType.Set). Argumen Argumen, yang bersifat opsional, mengambil array jenis Object yang berisi argumen apa pun pada prosedur.

Anda dapat menggunakan CallByName dengan kelas dalam solusi saat ini, tetapi ia paling sering digunakan untuk mengakses objek COM atau objek dari assembly .NET Framework.

Anggap saja Anda menambahkan referensi ke assembly yang berisi kelas bernama MathClass, yang memiliki fungsi baru bernama SquareRoot, seperti yang ditunjukkan dalam kode berikut:

Class MathClass
    Function SquareRoot(ByVal X As Double) As Double
        Return Math.Sqrt(X)
    End Function
    Function InverseSine(ByVal X As Double) As Double
        Return Math.Atan(X / Math.Sqrt(-X * X + 1))
    End Function
    Function Acos(ByVal X As Double) As Double
        Return Math.Atan(-X / Math.Sqrt(-X * X + 1)) + 2 * Math.Atan(1)
    End Function
End Class

Aplikasi Anda dapat menggunakan kontrol kotak teks untuk mengontrol metode mana yang akan dipanggil dan argumennya. Misalnya, jika TextBox1 berisi ekspresi yang akan dievaluasi, dan TextBox2 digunakan untuk memasukkan nama fungsi, Anda dapat menggunakan kode berikut untuk memanggil fungsi SquareRoot pada ekspresi dalam TextBox1:

Private Sub CallMath()
    Dim Math As New MathClass
    Me.TextBox1.Text = CStr(CallByName(Math, Me.TextBox2.Text,
       Microsoft.VisualBasic.CallType.Method, TextBox1.Text))
End Sub

Jika Anda memasukkan "64" dalam TextBox1, "SquareRoot" dalam TextBox2, lalu memanggil prosedur CallMath, akar kuadrat dari angka dalam TextBox1 dievaluasi. Kode dalam contoh memanggil fungsi SquareRoot (yang mengambil string yang berisi ekspresi yang akan dievaluasi sebagai argumen yang diperlukan) dan menampilkan "8" dalam TextBox1 (akar kuadrat 64). Tentu saja, jika pengguna memasukkan string yang tidak valid dalam TextBox2, jika string berisi nama properti alih-alih metode, atau jika metode memiliki argumen tambahan yang diperlukan, kesalahan run-time terjadi. Anda harus menambahkan kode penanganan kesalahan yang kuat saat menggunakan CallByName untuk mengantisipasi kesalahan ini atau kesalahan lainnya.

Catatan

Meski fungsi CallByName mungkin berguna dalam beberapa kasus, Anda harus menimbang kegunaannya terhadap implikasi performa — penggunaan CallByName untuk memanggil prosedur sedikit lebih lambat daripada panggilan ikatan terakhir. Jika Anda memanggil fungsi yang dipanggil berulang kali, seperti di dalam perulangan, CallByName dapat berefek parah pada performa.

Lihat juga