Sdílet prostřednictvím


Návod: Vytváření a používání dynamických objektů v jazyce Visual Basic

Dynamické objekty zpřístupňují členy, jako jsou vlastnosti a metody za běhu, a ne v době kompilace. To umožňuje vytvářet objekty pro práci se strukturami, které neodpovídají statickému typu nebo formátu. Pomocí dynamického objektu můžete například odkazovat na model DOM (Document Object Model) HTML, který může obsahovat libovolnou kombinaci platných elementů a atributů značek HTML. Vzhledem k tomu, že každý dokument HTML je jedinečný, členové určitého dokumentu HTML jsou určeny za běhu. Běžnou metodou odkazování na atribut elementu HTML je předat název atributu GetProperty metodě elementu. Chcete-li odkazovat na id atribut html element <div id="Div1">, nejprve získáte odkaz na <div> element a pak použít divElement.GetProperty("id"). Pokud používáte dynamický objekt, můžete odkazovat na id atribut jako divElement.id.

Dynamické objekty také poskytují pohodlný přístup k dynamickým jazykům, jako je IronPython a IronRuby. Pomocí dynamického objektu můžete odkazovat na dynamický skript, který se interpretuje za běhu.

Na dynamický objekt odkazujete pomocí pozdní vazby. Typ pozdního vázaného objektu zadáte jako Object. Další informace najdete v tématu [Časná a pozdní vazba.

Vlastní dynamické objekty můžete vytvořit pomocí tříd v System.Dynamic oboru názvů. Můžete například vytvořit ExpandoObject a zadat členy tohoto objektu za běhu. Můžete také vytvořit vlastní typ, který dědí DynamicObject třídu. Potom můžete přepsat členy DynamicObject třídy, aby poskytovaly dynamické funkce za běhu.

Tento článek obsahuje dva nezávislé názorné postupy:

  • Vytvořte vlastní objekt, který dynamicky zveřejňuje obsah textového souboru jako vlastnosti objektu.

  • Vytvořte projekt, který používá knihovnu IronPython .

Můžete udělat jednu z těchto nebo obou, a pokud uděláte obojí, pořadí nezáleží.

Požadavky

Poznámka:

Váš počítač může v následujících pokynech zobrazovat odlišné názvy nebo umístění některých prvků uživatelského rozhraní sady Visual Studio. Tyto prvky jsou určeny edicí sady Visual Studio a použitým nastavením. Další informace najdete v tématu Přizpůsobení integrovaného vývojového prostředí.

  • Pro druhý názorný postup nainstalujte IronPython pro .NET. Přejděte na stránku Pro stažení a získejte nejnovější verzi.

Vytvoření vlastního dynamického objektu

První návod definuje vlastní dynamický objekt, který prohledá obsah textového souboru. Dynamická vlastnost určuje hledaný text. Pokud například volání kódu určuje dynamicFile.Sample, dynamická třída vrátí obecný seznam řetězců, které obsahují všechny řádky ze souboru, které začínají na "Sample". Hledání nerozlišuje malá a velká písmena. Dynamická třída podporuje také dva volitelné argumenty. Prvním argumentem je hodnota výčtu možností hledání, která určuje, že dynamická třída by měla hledat shody na začátku řádku, na konci řádku nebo kdekoli na řádku. Druhý argument určuje, že dynamická třída by měla před hledáním oříznout úvodní a koncové mezery z každého řádku. Pokud například volání kódu určuje dynamicFile.Sample(StringSearchOption.Contains), dynamická třída vyhledá "Sample" kdekoli na řádku. Pokud volání kódu určuje dynamicFile.Sample(StringSearchOption.StartsWith, false), dynamická třída hledá na začátku každého řádku "Sample" a neodebere úvodní a koncové mezery. Výchozím chováním dynamické třídy je vyhledání shody na začátku každého řádku a odebrání úvodních a koncových mezer.

Vytvoření vlastní dynamické třídy

  1. Spusťte Visual Studio.

  2. Vyberte Vytvořit nový projekt.

  3. V dialogovém okně Vytvořit nový projekt vyberte Visual Basic, vyberte Konzolová aplikace a pak vyberte Další.

  4. V dialogovém okně Konfigurovat nový projekt zadejte DynamicSample název projektu a pak vyberte Další.

  5. V dialogovém okně Další informace vyberte .NET 5.0 (Aktuální) pro cílovou architekturu a pak vyberte Vytvořit.

    Vytvoří se nový projekt.

  6. V Průzkumník řešení klikněte pravým tlačítkem na projekt DynamicSample a vyberte >. Do pole Název zadejte ReadOnlyFilea pak vyberte Přidat.

    Přidá se nový soubor, který obsahuje ReadOnlyFile třída.

  7. V horní části souboru ReadOnlyFile.cs nebo ReadOnlyFile.vb přidejte následující kód pro import objektů System.IO a System.Dynamic oborů názvů.

    Imports System.IO
    Imports System.Dynamic
    
  8. Vlastní dynamický objekt používá výčt k určení kritérií hledání. Před příkaz třídy přidejte následující definici výčtu.

    Public Enum StringSearchOption
        StartsWith
        Contains
        EndsWith
    End Enum
    
  9. Aktualizujte příkaz třídy tak, aby dědil DynamicObject třídu, jak je znázorněno v následujícím příkladu kódu.

    Public Class ReadOnlyFile
        Inherits DynamicObject
    
  10. Do třídy přidejte následující kód ReadOnlyFile , který definuje privátní pole pro cestu k souboru a konstruktor pro ReadOnlyFile třídu.

    ' Store the path to the file and the initial line count value.
    Private p_filePath As String
    
    ' Public constructor. Verify that file exists and store the path in 
    ' the private variable.
    Public Sub New(ByVal filePath As String)
        If Not File.Exists(filePath) Then
            Throw New Exception("File path does not exist.")
        End If
    
        p_filePath = filePath
    End Sub
    
  11. Do třídy GetPropertyValue přidejte následující metodu ReadOnlyFile. Metoda GetPropertyValue přebírá jako vstupní kritéria kritéria hledání a vrací řádky z textového souboru, který odpovídá hledanému kritériu. Dynamické metody poskytované ReadOnlyFile třídou volají metodu GetPropertyValue pro načtení příslušných výsledků.

    Public Function GetPropertyValue(ByVal propertyName As String,
                                     Optional ByVal StringSearchOption As StringSearchOption = StringSearchOption.StartsWith,
                                     Optional ByVal trimSpaces As Boolean = True) As List(Of String)
    
        Dim sr As StreamReader = Nothing
        Dim results As New List(Of String)
        Dim line = ""
        Dim testLine = ""
    
        Try
            sr = New StreamReader(p_filePath)
    
            While Not sr.EndOfStream
                line = sr.ReadLine()
    
                ' Perform a case-insensitive search by using the specified search options.
                testLine = UCase(line)
                If trimSpaces Then testLine = Trim(testLine)
    
                Select Case StringSearchOption
                    Case StringSearchOption.StartsWith
                        If testLine.StartsWith(UCase(propertyName)) Then results.Add(line)
                    Case StringSearchOption.Contains
                        If testLine.Contains(UCase(propertyName)) Then results.Add(line)
                    Case StringSearchOption.EndsWith
                        If testLine.EndsWith(UCase(propertyName)) Then results.Add(line)
                End Select
            End While
        Catch
            ' Trap any exception that occurs in reading the file and return Nothing.
            results = Nothing
        Finally
            If sr IsNot Nothing Then sr.Close()
        End Try
    
        Return results
    End Function
    
  12. Za metodu GetPropertyValue přidejte následující kód, který přepíše TryGetMember metodu DynamicObject třídy. Metoda TryGetMember je volána, když je požadován člen dynamické třídy a nejsou zadány žádné argumenty. Argument binder obsahuje informace o odkazovaném členu a result argument odkazuje na výsledek vrácený pro zadaný člen. Metoda TryGetMember vrátí logickou hodnotu, která vrátí true , pokud požadovaný člen existuje; jinak vrátí false.

    ' Implement the TryGetMember method of the DynamicObject class for dynamic member calls.
    Public Overrides Function TryGetMember(ByVal binder As GetMemberBinder,
                                           ByRef result As Object) As Boolean
        result = GetPropertyValue(binder.Name)
        Return If(result Is Nothing, False, True)
    End Function
    
  13. Za metodu TryGetMember přidejte následující kód, který přepíše TryInvokeMember metodu DynamicObject třídy. Metoda TryInvokeMember je volána, když člen dynamické třídy je požadován s argumenty. Argument binder obsahuje informace o odkazovaném členu a result argument odkazuje na výsledek vrácený pro zadaný člen. Argument args obsahuje pole argumentů, které jsou předány členu. Metoda TryInvokeMember vrátí logickou hodnotu, která vrátí true , pokud požadovaný člen existuje; jinak vrátí false.

    Vlastní verze TryInvokeMember metody očekává, že první argument bude hodnotou z výčtu StringSearchOption , který jste definovali v předchozím kroku. Metoda TryInvokeMember očekává, že druhým argumentem bude logická hodnota. Pokud jsou jeden nebo oba argumenty platné hodnoty, předají GetPropertyValue se metodě pro načtení výsledků.

    ' Implement the TryInvokeMember method of the DynamicObject class for 
    ' dynamic member calls that have arguments.
    Public Overrides Function TryInvokeMember(ByVal binder As InvokeMemberBinder,
                                              ByVal args() As Object,
                                              ByRef result As Object) As Boolean
    
        Dim StringSearchOption As StringSearchOption = StringSearchOption.StartsWith
        Dim trimSpaces = True
    
        Try
            If args.Length > 0 Then StringSearchOption = CType(args(0), StringSearchOption)
        Catch
            Throw New ArgumentException("StringSearchOption argument must be a StringSearchOption enum value.")
        End Try
    
        Try
            If args.Length > 1 Then trimSpaces = CType(args(1), Boolean)
        Catch
            Throw New ArgumentException("trimSpaces argument must be a Boolean value.")
        End Try
    
        result = GetPropertyValue(binder.Name, StringSearchOption, trimSpaces)
    
        Return If(result Is Nothing, False, True)
    End Function
    
  14. Soubor uložte a zavřete.

Vytvoření ukázkového textového souboru

  1. V Průzkumník řešení klikněte pravým tlačítkem myši na projekt DynamicSample a vyberte Přidat> V podokně Nainstalované šablony vyberte Obecné a pak vyberte šablonu Textové soubory. V poli Název ponechte výchozí název TextFile1.txta klikněte na tlačítko Přidat. Do projektu se přidá nový textový soubor.

  2. Zkopírujte následující text do souboru TextFile1.txt .

    List of customers and suppliers
    
    Supplier: Lucerne Publishing (https://www.lucernepublishing.com/)
    Customer: Preston, Chris
    Customer: Hines, Patrick
    Customer: Cameron, Maria
    Supplier: Graphic Design Institute (https://www.graphicdesigninstitute.com/)
    Supplier: Fabrikam, Inc. (https://www.fabrikam.com/)
    Customer: Seubert, Roxanne
    Supplier: Proseware, Inc. (http://www.proseware.com/)
    Customer: Adolphi, Stephan
    Customer: Koch, Paul
    
  3. Soubor uložte a zavřete.

Vytvoření ukázkové aplikace, která používá vlastní dynamický objekt

  1. V Průzkumník řešení poklikejte na soubor Program.vb.

  2. Do procedury přidejte následující kód Main , který vytvoří instanci ReadOnlyFile třídy pro TextFile1.txt soubor. Kód používá pozdní vazbu k volání dynamických členů a načtení řádků textu, které obsahují řetězec "Customer".

    Dim rFile As Object = New ReadOnlyFile("..\..\..\TextFile1.txt")
    For Each line In rFile.Customer
        Console.WriteLine(line)
    Next
    Console.WriteLine("----------------------------")
    For Each line In rFile.Customer(StringSearchOption.Contains, True)
        Console.WriteLine(line)
    Next
    
  3. Uložte soubor a stisknutím ctrl +F5 sestavte a spusťte aplikaci.

Volání dynamické jazykové knihovny

Následující návod vytvoří projekt, který přistupuje k knihovně napsané v dynamickém jazyce IronPython.

Vytvoření vlastní dynamické třídy

  1. V sadě Visual Studio vyberte Soubor>nový>projekt.

  2. V dialogovém okně Vytvořit nový projekt vyberte Visual Basic, vyberte Konzolová aplikace a pak vyberte Další.

  3. V dialogovém okně Konfigurovat nový projekt zadejte DynamicIronPythonSample název projektu a pak vyberte Další.

  4. V dialogovém okně Další informace vyberte .NET 5.0 (Aktuální) pro cílovou architekturu a pak vyberte Vytvořit.

    Vytvoří se nový projekt.

  5. Nainstalujte balíček NuGet IronPython.

  6. Upravte soubor Program.vb.

  7. V horní části souboru přidejte následující kód pro import a Microsoft.Scripting.HostingIronPython.Hosting obory názvů z knihoven IronPython a System.Linq oboru názvů.

    Imports Microsoft.Scripting.Hosting
    Imports IronPython.Hosting
    Imports System.Linq
    
  8. Do metody Main přidejte následující kód pro vytvoření nového Microsoft.Scripting.Hosting.ScriptRuntime objektu pro hostování knihoven IronPython. Objekt ScriptRuntime načte modul knihovny IronPython random.py.

    ' Set the current directory to the IronPython libraries.
    System.IO.Directory.SetCurrentDirectory(
        Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) &
           "\IronPython 2.7\Lib")
    
    ' Create an instance of the random.py IronPython library.
    Console.WriteLine("Loading random.py")
    Dim py = Python.CreateRuntime()
    Dim random As Object = py.UseFile("random.py")
    Console.WriteLine("random.py loaded.")
    
  9. Po načtení kódu modulu random.py přidejte následující kód, který vytvoří pole celých čísel. Pole se předává shuffle metodě modulu random.py, který náhodně seřadí hodnoty v matici.

    ' Initialize an enumerable set of integers.
    Dim items = Enumerable.Range(1, 7).ToArray()
    
    ' Randomly shuffle the array of integers by using IronPython.
    For i = 0 To 4
        random.shuffle(items)
        For Each item In items
            Console.WriteLine(item)
        Next
        Console.WriteLine("-------------------")
    Next
    
  10. Uložte soubor a stisknutím ctrl +F5 sestavte a spusťte aplikaci.

Viz také