Dize Adı Kullanarak Özellik veya Yöntem Çağırma (Visual Basic)

Çoğu durumda, tasarım zamanında bir nesnenin özelliklerini ve yöntemlerini bulabilir ve bunları işlemek için kod yazabilirsiniz. Ancak bazı durumlarda, bir nesnenin özellikleri ve yöntemleri hakkında önceden bilginiz olmayabilir veya yalnızca son kullanıcının çalışma zamanında özellikleri belirtmesini veya yöntemleri yürütmesini sağlama esnekliğini isteyebilirsiniz.

CallByName İşlevi

Örneğin, bir com bileşenine bir işleç geçirerek kullanıcı tarafından girilen ifadeleri değerlendiren bir istemci uygulaması düşünün. Bileşene sürekli olarak yeni işleçler gerektiren yeni işlevler eklediğinizi varsayalım. Standart nesne erişim tekniklerini kullandığınızda, istemci uygulamasının yeni işleçleri kullanabilmesi için önce yeniden derlemeniz ve yeniden dağıtmanız gerekir. Bunu önlemek için, uygulamayı değiştirmeden yeni işleçleri dize olarak geçirmek için işlevini kullanabilirsiniz CallByName .

işlevi, CallByName çalışma zamanında bir özellik veya yöntem belirtmek için bir dize kullanmanıza olanak tanır. İşlevin CallByName imzası şöyle görünür:

Sonuç = CallByName(Object, ProcedureName, CallType, Arguments())

İlk bağımsız değişken olan Object, üzerinde işlem yapmak istediğiniz nesnenin adını alır. ProcedureName bağımsız değişkeni, çağrılacak yöntemin veya özellik yordamının adını içeren bir dize alır. CallType bağımsız değişkeni, çağrılacak yordam türünü temsil eden bir sabit alır: yöntem (Microsoft.VisualBasic.CallType.Method), okunan bir özellik (Microsoft.VisualBasic.CallType.Get) veya özellik kümesi (Microsoft.VisualBasic.CallType.Set). İsteğe bağlı olan Arguments bağımsız değişkeni, yordamın bağımsız değişkenlerini içeren bir tür Object dizisi alır.

Çözümünüzdeki sınıflarla CallByName kullanabilirsiniz ancak çoğunlukla COM nesnelerine veya .NET Framework derlemelerinden gelen nesnelere erişmek için kullanılır.

Bir sınıf olan MathClass'e ve yeni bir işlevi olan SquareRoot'e başvuru eklediğinizi ve bunun aşağıdaki kodda gösterildiğini varsayalım:

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

Uygulamanız hangi yöntemin çağrılacağını ve bağımsız değişkenlerini denetlemek için metin kutusu denetimlerini kullanabilir. Örneğin, değerlendirilecek ifadeyi TextBox1 içinde taşıyorsa ve TextBox2 işlevin adını girmek için kullanılıyorsa, SquareRoot içindeki ifadede TextBox1 işlevini çağırmak için aşağıdaki kodu kullanabilirsiniz.

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

"64" sayısını TextBox1, "Karekök" fonksiyonu TextBox2 içine girerseniz ve ardından CallMath prosedürünü çağırırsanız, TextBox1 içindeki sayının karekökü değerlendirilir. Örnekteki kod, bir dize (değerlendirilecek ifadeyi içeren ve gerekli bir bağımsız değişken olan) alan SquareRoot fonksiyonunu çağırır ve TextBox1 içinde "8" (64'ün karekökü) döndürür. Elbette, kullanıcı içinde TextBox2geçersiz bir dize girerse, dize bir yöntem yerine bir özelliğin adını içeriyorsa veya yöntemin ek bir gerekli bağımsız değişkeni varsa, bir çalışma zamanı hatası oluşur. Bu tür veya diğer hataları öngördüğünüzde CallByName kullanırken sağlam hata işleme kodu eklemeniz gerekir.

Uyarı

CallByName İşlev bazı durumlarda yararlı olabilse de, kullanışlılığını performans etkilerine karşı tartmalısınız; CallByName bir yordam çağrısı yapmak için kullanmak, geç bağlanan bir çağrıdan biraz daha yavaştır. Döngü içinde olduğu gibi tekrar tekrar çağrılan bir işlevi çağırırsanız performans CallByName üzerinde ciddi bir etkisi olabilir.

Ayrıca bakınız