Útmutató: Dinamikus objektumok létrehozása és használata a Visual Basicben

A dinamikus objektumok a fordítási idő helyett futtatáskor teszik elérhetővé a tagokat, például tulajdonságokat és metódusokat. Ez lehetővé teszi, hogy olyan objektumokat hozzon létre, amelyek statikus típusnak vagy formátumnak nem megfelelő struktúrákkal működnek. Használhat például egy dinamikus objektumot a HTML-dokumentumobjektum-modellre (DOM), amely érvényes HTML-jelölőelemek és attribútumok bármilyen kombinációját tartalmazhatja. Mivel minden HTML-dokumentum egyedi, egy adott HTML-dokumentum tagjai futásidőben lesznek meghatározva. Egy HTML-elem attribútumára való hivatkozás gyakori módszere az attribútum nevének átadása az GetProperty elem metódusának. A HTML-elem id attribútumára való hivatkozáshoz először meg kell szereznie az <div> elemre mutató hivatkozást, majd alkalmaznia kell a divElement.GetProperty("id")-t. Ha dinamikus objektumot használ, hivatkozhat az id attribútumra divElement.id.

A dinamikus objektumok emellett kényelmes hozzáférést biztosítanak olyan dinamikus nyelvekhez, mint az IronPython és az IronRuby. Dinamikus objektummal futtatáskor értelmezett dinamikus szkriptekre hivatkozhat.

Egy dinamikus objektumra késői kötéssel hivatkozhat. A késői kötésű objektumok Objecttípusát a következőképpen adhatja meg: . További információ: [Korai és késői kötés.

Egyéni dinamikus objektumokat a névtérben lévő System.Dynamic osztályok használatával hozhat létre. Létrehozhat például egy ExpandoObject objektumot, és megadhatja az objektum tagjait futásidőben. Létrehozhat saját típust is, amely örökli az osztályt DynamicObject . Ezután felülírhatja a DynamicObject osztály tagjait, hogy biztosítsa a futásidejű dinamikus funkciókat.

Ez a cikk két független útmutatót tartalmaz:

  • Hozzon létre egy egyéni objektumot, amely dinamikusan elérhetővé teszi egy szövegfájl tartalmát egy objektum tulajdonságaiként.

  • Hozzon létre egy tárat IronPython használó projektet.

Az egyiket vagy mindkettőt megteheti, és ha mindkettőt megteszi, a sorrend nem számít.

Előfeltételek

Megjegyzés

Előfordulhat, hogy a számítógép különböző neveket vagy helyeket jelenít meg a Visual Studio felhasználói felületének egyes elemeihez az alábbi utasításokban. Ezeket az elemeket a Visual Studio-kiadás és a használt beállítások határozzák meg. További információ: Az IDE személyre szabása.

Egyéni dinamikus objektum létrehozása

Az első útmutató egy egyéni dinamikus objektumot határoz meg, amely egy szövegfájl tartalmában keres. A dinamikus tulajdonság megadja a keresendő szöveget. Ha például a hívási kód megadása dynamicFile.Sampletörténik, a dinamikus osztály a "Minta" kezdetű fájl összes sorát tartalmazó sztringek általános listáját adja vissza. A keresés nem érzékeny a kis- és nagybetűkre. A dinamikus osztály két választható argumentumot is támogat. Az első argumentum egy keresési beállítás enumerálási értéke, amely azt határozza meg, hogy a dinamikus osztálynak a sor elején, a sor végén vagy bárhol a sorban kell keresnie az egyezéseket. A második argumentum azt határozza meg, hogy a dinamikus osztály a keresés előtt minden sorból levágja a kezdő és záró szóközöket. Például, ha a hívási kód megadja a dynamicFile.Sample(StringSearchOption.Contains)-t, a dinamikus osztály bárhol a sorban keresi a "Minta" kifejezést. Ha a hívó kódban meg van adva a dynamicFile.Sample(StringSearchOption.StartsWith, false), a dinamikus osztály az egyes sorok elején a "Minta" kifejezésre keres, és nem távolít el kezdő és záró szóközöket. A dinamikus osztály alapértelmezett viselkedése az, hogy az egyes sorok elején keres egyezést, és eltávolítja a kezdő és záró szóközöket.

Egyéni dinamikus osztály létrehozása

  1. Indítsa el a Visual Studiót.

  2. Válassza az Új projekt létrehozása lehetőséget.

  3. Az Új projekt létrehozása párbeszédpanelen válassza a Visual Basic, a Konzolalkalmazás, majd a Tovább lehetőséget.

  4. Az új projekt konfigurálása párbeszédpanelen adja meg DynamicSample a projekt nevét, majd válassza a Tovább gombot.

  5. A További információ párbeszédpanelen válassza a .NET 5.0 (Aktuális) lehetőséget a cél-keretrendszerhez, majd válassza a Létrehozás lehetőséget.

    Létrejön az új projekt.

  6. A Megoldáskezelőben kattintson a jobb gombbal a DynamicSample projektre, és válassza az Hozzáadás>Osztály lehetőséget. Írja be a Név mezőbe, majd válassza a Hozzáadás lehetőséget.ReadOnlyFile

    A rendszer hozzáad egy új fájlt, amely tartalmazza a ReadOnlyFile osztályt.

  7. A ReadOnlyFile.cs vagy ReadOnlyFile.vb fájl tetejére adja hozzá a következő kódot a System.IO és System.Dynamic névterek importálásához.

    Imports System.IO
    Imports System.Dynamic
    
  8. Az egyéni dinamikus objektum enumerálást használ a keresési feltételek meghatározásához. Az osztálynyilatkozat előtt adja hozzá a következő enum definíciót.

    Public Enum StringSearchOption
        StartsWith
        Contains
        EndsWith
    End Enum
    
  9. Frissítse az osztályutasítást, hogy örökölje az DynamicObject osztályt, ahogy az az alábbi kód példában is látható.

    Public Class ReadOnlyFile
        Inherits DynamicObject
    
  10. Adja hozzá az alábbi kódot az osztályhoz a ReadOnlyFile fájl elérési útjának privát mezőjének és az osztály konstruktorának ReadOnlyFile meghatározásához.

    ' 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. Adja hozzá a következő GetPropertyValue metódust a ReadOnlyFile osztályhoz. A GetPropertyValue metódus bemenetként keresési feltételeket vesz fel, és visszaadja az adott keresési feltételnek megfelelő szövegfájl sorait. Az ReadOnlyFile osztály dinamikus metódusai meghívják a GetPropertyValue metódust, hogy lekérjék a megfelelő eredményeket.

    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. A GetPropertyValue metódus után adja hozzá a következő kódot az TryGetMember metódus felülbírálásához a DynamicObject osztályban. A TryGetMember metódus akkor lesz meghívva, ha egy dinamikus osztály egy tagját kérik le, és nincsenek megadva argumentumok. Az binder argumentum információt tartalmaz a hivatkozott tagról, az argumentum pedig result a megadott tagnak visszaadott eredményre hivatkozik. A TryGetMember metódus egy logikai értéket ad vissza, amely akkor ad vissza true , ha a kért tag létezik, ellenkező esetben ad vissza 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. A TryGetMember metódus után adja hozzá a következő kódot a DynamicObject osztály TryInvokeMember metódusának felülbírálásához. A TryInvokeMember metódus akkor lesz meghívva, ha egy dinamikus osztály egy tagját argumentumokkal kérik le. Az binder argumentum információt tartalmaz a hivatkozott tagról, az argumentum pedig result a megadott tagnak visszaadott eredményre hivatkozik. Az args argumentum a tagnak átadott argumentumok tömbét tartalmazza. A TryInvokeMember metódus egy logikai értéket ad vissza, amely akkor ad vissza true , ha a kért tag létezik, ellenkező esetben ad vissza false.

    A metódus egyéni verziója TryInvokeMember arra számít, hogy az első argumentum értéke az StringSearchOption előző lépésben definiált számból származik. A TryInvokeMember metódus azt várja, hogy a második argumentum logikai érték legyen. Ha az egyik vagy mindkét argumentum érvényes érték, a rendszer átadja azokat a GetPropertyValue metódusnak az eredmények lekéréséhez.

    ' 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. Mentse és zárja be a fájlt.

Szövegfájlminta létrehozása

  1. A Megoldáskezelő, kattintson jobb gombbal a DynamicSample projekten, és válassza az Új hozzáadása>Új elem. A Telepített sablonok panelen válassza az Általános, majd a Szövegfájl sablont. Hagyja meg a TextFile1.txt alapértelmezett nevét a Név mezőben, majd kattintson a Hozzáadás gombra. A program új szövegfájlt ad hozzá a projekthez.

  2. Másolja a következő szöveget a TextFile1.txt fájlba.

    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. Mentse és zárja be a fájlt.

Egyéni dinamikus objektumot használó mintaalkalmazás létrehozása

  1. A Megoldáskezelő kattintson duplán a Program.vb fájlra.

  2. Adja hozzá az alábbi kódot az eljáráshoz az Main osztály egy példányának ReadOnlyFile létrehozásához a TextFile1.txt fájlhoz. A kód késői kötést használ a dinamikus tagok meghívásához és az "Ügyfél" sztringet tartalmazó szövegsorok lekéréséhez.

    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. Mentse a fájlt, és nyomja le a Ctrl F5 billentyűkombinációt+az alkalmazás létrehozásához és futtatásához.

Dinamikus nyelvi kódtár meghívása

Az alábbi útmutató egy olyan projektet hoz létre, amely az IronPython dinamikus nyelven írt kódtárhoz fér hozzá.

Egyéni dinamikus osztály létrehozása

  1. A Visual Studióban válassza a Fájl>Új>Projekt menüpontot.

  2. Az Új projekt létrehozása párbeszédpanelen válassza a Visual Basic, a Konzolalkalmazás, majd a Tovább lehetőséget.

  3. Az új projekt konfigurálása párbeszédpanelen adja meg DynamicIronPythonSample a projekt nevét, majd válassza a Tovább gombot.

  4. A További információ párbeszédpanelen válassza a .NET 5.0 (Aktuális) lehetőséget a cél-keretrendszerhez, majd válassza a Létrehozás lehetőséget.

    Létrejön az új projekt.

  5. Telepítse az IronPython NuGet-csomagot.

  6. Szerkessze a Program.vb fájlt.

  7. A fájl tetején adja hozzá a következő kódot, hogy importálja az Microsoft.Scripting.Hosting és IronPython.Hosting névtereket az IronPython könyvtárakból, valamint a System.Linq névteret.

    Imports Microsoft.Scripting.Hosting
    Imports IronPython.Hosting
    Imports System.Linq
    
  8. A Main metódusban adja hozzá a következő kódot egy új Microsoft.Scripting.Hosting.ScriptRuntime objektum létrehozásához az IronPython-kódtárak üzemeltetéséhez. Az ScriptRuntime objektum betölti az IronPython könyvtármodult 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. Miután betöltötte a random.py modult, adja hozzá a következő kódot, hogy egész számokat tartalmazó tömböt hozzon létre. A tömb a random.py modul metódusának lesz átadva shuffle , amely véletlenszerűen rendezi a tömb értékeit.

    ' 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. Mentse a fájlt, és nyomja le a Ctrl F5 billentyűkombinációt+az alkalmazás létrehozásához és futtatásához.

Lásd még