Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ç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:
Result = 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.
Geçerli çözümünüzdeki sınıflarla kullanabilirsiniz CallByName
, ancak çoğunlukla .NET Framework derlemelerinden COM nesnelerine veya nesnelerine erişmek için kullanılır.
Aşağıdaki kodda gösterildiği gibi adlı yeni bir işleve sahip olan adlı MathClass
SquareRoot
sınıfı içeren bir derlemeye başvuru eklediğinizi 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 içeriyorsa ve TextBox2
işlevin adını girmek için kullanılıyorsaTextBox1
, içindeki ifadede TextBox1
işlevini çağırmak SquareRoot
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
içinde , "SquareRoot" içine TextBox1
"64" TextBox2
girer ve sonra yordamı çağırırsanız CallMath
, içindeki TextBox1
sayının karekök değeri değerlendirilir. Örnekteki kod işlevi çağırır SquareRoot
(gerekli bağımsız değişken olarak değerlendirilecek ifadeyi içeren bir dize alır) ve içinde TextBox1
"8" döndürür (64'ün karekökünü). Elbette, kullanıcı içinde TextBox2
geç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. Bunları veya diğer hataları tahmin etmek için kullanırken CallByName
güçlü hata işleme kodu eklemeniz gerekir.
Not
CallByName
İşlev bazı durumlarda yararlı olsa da, kullanışlılığını performans etkilerine karşı tartmalısınız; CallByName
bir yordamı çağırmak 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.