Volání vlastnosti nebo metody pomocí názvu řetězce (Visual Basic)
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:
Result = 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
třídy, ale nejčastěji se používá pro přístup k objektům modelu 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 řízení, 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 TextBox1
použí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 pole , "SquareRoot" zadáte "64TextBox1
" TextBox2
a zavoláte proceduruCallMath
, vyhodnotí se druhá odmocnina čísla.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.