Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
- Visual Studio 2019 verze 16.9 nebo novější s nainstalovanou úlohou vývoje desktopových aplikací .NET Sada .NET 5 SDK se automaticky nainstaluje při výběru této úlohy.
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
Spusťte Visual Studio.
Vyberte Vytvořit nový projekt.
V dialogovém okně Vytvořit nový projekt vyberte Visual Basic, vyberte Konzolová aplikace a pak vyberte Další.
V dialogovém okně Konfigurovat nový projekt zadejte
DynamicSamplenázev projektu a pak vyberte Další.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.
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.
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.DynamicVlastní 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 EnumAktualizujte příkaz třídy tak, aby dědil
DynamicObjecttřídu, jak je znázorněno v následujícím příkladu kódu.Public Class ReadOnlyFile Inherits DynamicObjectDo třídy přidejte následující kód
ReadOnlyFile, který definuje privátní pole pro cestu k souboru a konstruktor proReadOnlyFiletří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 SubDo třídy
GetPropertyValuepřidejte následující metoduReadOnlyFile. MetodaGetPropertyValuepř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éReadOnlyFiletřídou volají metoduGetPropertyValuepro 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 FunctionZa metodu
GetPropertyValuepř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. Argumentbinderobsahuje informace o odkazovaném členu aresultargument 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 FunctionZa metodu
TryGetMemberpř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. Argumentbinderobsahuje informace o odkazovaném členu aresultargument odkazuje na výsledek vrácený pro zadaný člen. Argumentargsobsahuje 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
TryInvokeMembermetody očekává, že první argument bude hodnotou z výčtuStringSearchOption, který jste definovali v předchozím kroku. MetodaTryInvokeMemberočekává, že druhým argumentem bude logická hodnota. Pokud jsou jeden nebo oba argumenty platné hodnoty, předajíGetPropertyValuese 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 FunctionSoubor uložte a zavřete.
Vytvoření ukázkového textového souboru
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.
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, PaulSoubor uložte a zavřete.
Vytvoření ukázkové aplikace, která používá vlastní dynamický objekt
V Průzkumník řešení poklikejte na soubor Program.vb.
Do procedury přidejte následující kód
Main, který vytvoří instanciReadOnlyFiletří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) NextUlož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
V sadě Visual Studio vyberte Soubor>nový>projekt.
V dialogovém okně Vytvořit nový projekt vyberte Visual Basic, vyberte Konzolová aplikace a pak vyberte Další.
V dialogovém okně Konfigurovat nový projekt zadejte
DynamicIronPythonSamplenázev projektu a pak vyberte Další.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.
Upravte soubor Program.vb.
V horní části souboru přidejte následující kód pro import a
Microsoft.Scripting.HostingIronPython.Hostingobory názvů z knihoven IronPython aSystem.Linqoboru názvů.Imports Microsoft.Scripting.Hosting Imports IronPython.Hosting Imports System.LinqDo metody Main přidejte následující kód pro vytvoření nového
Microsoft.Scripting.Hosting.ScriptRuntimeobjektu pro hostování knihoven IronPython. ObjektScriptRuntimenač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.")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á
shufflemetodě 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("-------------------") NextUložte soubor a stisknutím ctrl +F5 sestavte a spusťte aplikaci.