Sdílet prostřednictvím


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 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 pole , "SquareRoot" zadáte "64TextBox1" TextBox2a 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.

Viz také