Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ve většině případů můžete zjistit vlastnosti a metody objektu v době návrhu a napsat kód, který je zpracuje. V některých případech ale nemusíte předem vědět o vlastnostech a metodách objektu nebo můžete chtít, aby koncový uživatel mohl za běhu zadat vlastnosti nebo metody spustit.
CallByName – funkce
Představte si například klientskou aplikaci, která vyhodnocuje výrazy zadané uživatelem předáním operátoru komponentě COM. Předpokládejme, že do komponenty neustále přidáváte nové funkce, které vyžadují nové operátory. Při použití standardních technik přístupu k objektům je nutné znovu zkompilovat a znovu distribuovat klientskou aplikaci, aby mohla používat nové operátory. Abyste tomu předešli, můžete funkci použít CallByName k předání nových operátorů jako řetězců beze změny aplikace.
Funkce CallByName umožňuje použít řetězec k určení vlastnosti nebo metody za běhu. Podpis funkce CallByName vypadá takto:
Výsledek = CallByName(Object, ProcedureName, CallType, Arguments())
První argument , Object, přebírá název objektu, na který chcete jednat. Argument ProcedureName přebírá řetězec, který obsahuje název metody nebo procedury vlastnosti, která má být vyvolána. Argument CallType přebírá konstantu, která představuje typ procedury, která má vyvolat: metodu (Microsoft.VisualBasic.CallType.Method), vlastnost read (Microsoft.VisualBasic.CallType.Get) nebo sadu vlastností (Microsoft.VisualBasic.CallType.Set). Argument Argumenty , který je nepovinný, přebírá pole typu Object , který obsahuje všechny argumenty procedury.
V aktuálním řešení můžete použít CallByName s třídami, ale nejčastěji se používá pro přístup k objektům COM nebo objektům ze sestavení rozhraní .NET Framework.
Předpokládejme, že přidáte odkaz na sestavení, které obsahuje třídu s názvem MathClass, která má novou funkci s názvem SquareRoot, jak je znázorněno v následujícím kódu:
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
Aplikace může použít ovládací prvky textového pole k určení, která metoda bude volána a jaké argumenty. Pokud například TextBox1 obsahuje výraz, který se má vyhodnotit, a TextBox2 slouží k zadání názvu funkce, můžete k vyvolání SquareRoot funkce ve výrazu TextBox1použít následující kód:
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
Pokud do TextBox1 zadáte "64", do TextBox2 "SquareRoot" a poté zavoláte proceduru CallMath, vyhodnotí se druhá odmocnina čísla v TextBox1. Kód v příkladu SquareRoot vyvolá funkci (která přebírá řetězec obsahující výraz, který se má vyhodnotit jako povinný argument) a vrátí "8" v TextBox1 (druhou odmocninu 64). Samozřejmě, pokud uživatel zadá neplatný řetězec v TextBox2, pokud řetězec obsahuje název vlastnosti místo metody, nebo pokud má metoda další povinný argument, dojde k chybě za běhu. Při očekávání těchto nebo jiných chyb musíte přidat robustní kód CallByName pro zpracování chyb.
Poznámka:
CallByName I když může být funkce v některých případech užitečná, musíte zvážit její užitečnost vůči dopadům na výkon – použití CallByName k vyvolání procedury je mírně pomalejší než opožděné volání. Pokud voláte funkci, která se volá opakovaně, například uvnitř smyčky, CallByName může mít závažný vliv na výkon.