Een eigenschap of methode aanroepen met behulp van een tekenreeksnaam (Visual Basic)

In de meeste gevallen kunt u de eigenschappen en methoden van een object tijdens het ontwerp detecteren en code schrijven om deze te verwerken. In sommige gevallen weet u echter misschien niet van tevoren over de eigenschappen en methoden van een object, of wilt u misschien alleen de flexibiliteit om een eindgebruiker in staat te stellen eigenschappen op te geven of methoden tijdens runtime uit te voeren.

CallByName-functie

Denk bijvoorbeeld aan een clienttoepassing die expressies evalueert die door de gebruiker zijn ingevoerd door een operator door te geven aan een COM-onderdeel. Stel dat u voortdurend nieuwe functies toevoegt aan het onderdeel waarvoor nieuwe operators nodig zijn. Wanneer u standaardtechnieken voor objecttoegang gebruikt, moet u de clienttoepassing opnieuw compileren en opnieuw distribueren voordat deze de nieuwe operators kan gebruiken. Om dit te voorkomen, kunt u de CallByName functie gebruiken om de nieuwe operators door te geven als tekenreeksen, zonder de toepassing te wijzigen.

Met CallByName de functie kunt u een tekenreeks gebruiken om een eigenschap of methode op te geven tijdens runtime. De handtekening voor de CallByName functie ziet er als volgt uit:

Resultaat = CallByName(Object, ProcedureName, CallType, Arguments())

Het eerste argument, Object, neemt de naam van het object waarop u wilt reageren. Het argument ProcedureName gebruikt een tekenreeks die de naam van de methode of eigenschapsprocedure bevat die moet worden aangeroepen. Het argument CallType gebruikt een constante die het type procedure aanroept: een methode (Microsoft.VisualBasic.CallType.Method), een eigenschap gelezen (Microsoft.VisualBasic.CallType.Get) of een eigenschappenset (Microsoft.VisualBasic.CallType.Set). Het argument Argumenten , optioneel, gebruikt een matrix van het type Object dat argumenten bevat voor de procedure.

U kunt deze gebruiken CallByName met klassen in uw huidige oplossing, maar het wordt meestal gebruikt voor toegang tot COM-objecten of -objecten vanuit .NET Framework-assembly's.

Stel dat u een verwijzing toevoegt naar een assembly die een klasse bevat met MathClasseen nieuwe functie met de naam SquareRoot, zoals wordt weergegeven in de volgende code:

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

Uw toepassing kan tekstvakbesturingselementen gebruiken om te bepalen welke methode en de bijbehorende argumenten worden aangeroepen. Als TextBox1 bijvoorbeeld de expressie bevat die moet worden geëvalueerd en TextBox2 wordt gebruikt om de naam van de functie in te voeren, kunt u de volgende code gebruiken om de SquareRoot functie aan te roepen op de expressie in TextBox1:

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

Als u '64' invoert in TextBox1, 'SquareRoot' in TextBox2, en vervolgens de CallMath-procedure aanroept, wordt de vierkantswortel van het getal in TextBox1 geëvalueerd. De code in het voorbeeld roept de SquareRoot functie aan (waarbij een tekenreeks wordt gebruikt die de expressie als een vereist argument bevat) en retourneert '8' in TextBox1 (de vierkantswortel van 64). Als de gebruiker natuurlijk een ongeldige tekenreeks invoert in TextBox2, als de tekenreeks de naam van een eigenschap bevat in plaats van een methode, of als de methode een extra vereist argument heeft, treedt er een runtimefout op. U moet robuuste code voor foutafhandeling toevoegen wanneer u CallByName gebruikt om deze of andere fouten te anticiperen.

Opmerking

Hoewel de CallByName functie in sommige gevallen nuttig kan zijn, moet u de bruikbaarheid ervan afwegen tegen de gevolgen voor de prestaties. Het gebruik CallByName om een procedure aan te roepen is iets langzamer dan een te late aanroep. Als u een functie aanroept die herhaaldelijk wordt aangeroepen, zoals binnen een lus, CallByName kan dit een ernstig effect hebben op de prestaties.

Zie ook