Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
IronPythonhasználó projektet.
Az egyiket vagy mindkettőt megteheti, és ha mindkettőt megteszi, a sorrend nem számít.
Előfeltételek
- A Visual Studio 2019 16.9-es vagy újabb verziója telepített .NET asztali fejlesztési számítási feladattal. A számítási feladat kiválasztásakor a rendszer automatikusan telepíti a .NET 5 SDK-t.
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.
- A második útmutatóhoz telepítse a .NET-hez készült IronPythont . Lépjen a Letöltés lapra a legújabb verzió beszerzéséhez.
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
Indítsa el a Visual Studiót.
Válassza az Új projekt létrehozása lehetőséget.
Az Új projekt létrehozása párbeszédpanelen válassza a Visual Basic, a Konzolalkalmazás, majd a Tovább lehetőséget.
Az új projekt konfigurálása párbeszédpanelen adja meg
DynamicSamplea projekt nevét, majd válassza a Tovább gombot.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.
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.
ReadOnlyFileA rendszer hozzáad egy új fájlt, amely tartalmazza a ReadOnlyFile osztályt.
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.DynamicAz 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 EnumFrissítse az osztályutasítást, hogy örökölje az
DynamicObjectosztályt, ahogy az az alábbi kód példában is látható.Public Class ReadOnlyFile Inherits DynamicObjectAdja hozzá az alábbi kódot az osztályhoz a
ReadOnlyFilefájl elérési útjának privát mezőjének és az osztály konstruktoránakReadOnlyFilemeghatá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 SubAdja hozzá a következő
GetPropertyValuemetódust aReadOnlyFileosztályhoz. AGetPropertyValuemetódus bemenetként keresési feltételeket vesz fel, és visszaadja az adott keresési feltételnek megfelelő szövegfájl sorait. AzReadOnlyFileosztály dinamikus metódusai meghívják aGetPropertyValuemetó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 FunctionA
GetPropertyValuemetó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. Azbinderargumentum információt tartalmaz a hivatkozott tagról, az argumentum pedigresulta megadott tagnak visszaadott eredményre hivatkozik. A TryGetMember metódus egy logikai értéket ad vissza, amely akkor ad visszatrue, ha a kért tag létezik, ellenkező esetben ad visszafalse.' 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 FunctionA
TryGetMembermetó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. Azbinderargumentum információt tartalmaz a hivatkozott tagról, az argumentum pedigresulta megadott tagnak visszaadott eredményre hivatkozik. Azargsargumentum a tagnak átadott argumentumok tömbét tartalmazza. A TryInvokeMember metódus egy logikai értéket ad vissza, amely akkor ad visszatrue, ha a kért tag létezik, ellenkező esetben ad visszafalse.A metódus egyéni verziója
TryInvokeMemberarra számít, hogy az első argumentum értéke azStringSearchOptionelőző lépésben definiált számból származik. ATryInvokeMembermetó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 aGetPropertyValuemetó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 FunctionMentse és zárja be a fájlt.
Szövegfájlminta létrehozása
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.
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, PaulMentse és zárja be a fájlt.
Egyéni dinamikus objektumot használó mintaalkalmazás létrehozása
A Megoldáskezelő kattintson duplán a Program.vb fájlra.
Adja hozzá az alábbi kódot az eljáráshoz az
Mainosztály egy példányánakReadOnlyFilelé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) NextMentse 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
A Visual Studióban válassza a Fájl>Új>Projekt menüpontot.
Az Új projekt létrehozása párbeszédpanelen válassza a Visual Basic, a Konzolalkalmazás, majd a Tovább lehetőséget.
Az új projekt konfigurálása párbeszédpanelen adja meg
DynamicIronPythonSamplea projekt nevét, majd válassza a Tovább gombot.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.
Telepítse az IronPython NuGet-csomagot.
Szerkessze a Program.vb fájlt.
A fájl tetején adja hozzá a következő kódot, hogy importálja az
Microsoft.Scripting.HostingésIronPython.Hostingnévtereket az IronPython könyvtárakból, valamint aSystem.Linqnévteret.Imports Microsoft.Scripting.Hosting Imports IronPython.Hosting Imports System.LinqA Main metódusban adja hozzá a következő kódot egy új
Microsoft.Scripting.Hosting.ScriptRuntimeobjektum létrehozásához az IronPython-kódtárak üzemeltetéséhez. AzScriptRuntimeobjektum 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.")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("-------------------") NextMentse a fájlt, és nyomja le a Ctrl F5 billentyűkombinációt+az alkalmazás létrehozásához és futtatásához.