Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Obiekty dynamiczne uwidaczniają elementy członkowskie, takie jak właściwości i metody w czasie wykonywania, a nie w czasie kompilacji. Obiekty dynamiczne umożliwiają tworzenie obiektów do pracy ze strukturami, które nie są zgodne z typem statycznym ani formatem. Na przykład można użyć obiektu dynamicznego, aby odwołać się do modelu obiektów dokumentów HTML (DOM), który może zawierać dowolną kombinację prawidłowych elementów i atrybutów znaczników HTML. Ponieważ każdy dokument HTML jest unikatowy, elementy członkowskie określonego dokumentu HTML są określane w czasie wykonywania. Typową metodą przywołowania atrybutu elementu HTML jest przekazanie nazwy atrybutu do GetProperty
metody elementu. Aby odwołać się do atrybutu id
elementu HTML <div id="Div1">
, najpierw uzyskaj odwołanie do elementu <div>
, a następnie użyj divElement.GetProperty("id")
. Jeśli używasz obiektu dynamicznego, możesz odwołać się do atrybutu id
jako divElement.id
.
Obiekty dynamiczne zapewniają również wygodny dostęp do języków dynamicznych, takich jak IronPython i IronRuby. Za pomocą obiektu dynamicznego można odwoływać się do skryptu dynamicznego interpretowanego w czasie wykonywania.
Odwołujesz się do obiektu dynamicznego, używając opóźnionego powiązania. Typ obiektu wiązanego dynamicznie określa się jako dynamic
. Aby uzyskać więcej informacji, zobacz dynamiczny.
Niestandardowe obiekty dynamiczne można tworzyć przy użyciu klas w System.Dynamic przestrzeni nazw. Można na przykład utworzyć element ExpandoObject i określić składniki tego obiektu w czasie wykonywania. Możesz również utworzyć własny typ, który dziedziczy klasę DynamicObject . Następnie można zastąpić składowe DynamicObject klasy, aby zapewnić dynamiczną funkcjonalność w czasie wykonywania.
Ten artykuł zawiera dwa niezależne przewodniki:
- Utwórz obiekt niestandardowy, który dynamicznie uwidacznia zawartość pliku tekstowego jako właściwości obiektu.
- Utwórz projekt, który używa
IronPython
biblioteki.
Wymagania wstępne
- Program Visual Studio 2022 w wersji 17.3 lub nowszej z zainstalowanym modułem Programowanie aplikacji komputerowych .NET. Zestaw .NET 7 SDK jest dołączany podczas wybierania tego obciążenia.
Uwaga / Notatka
Na komputerze mogą być wyświetlane różne nazwy lub lokalizacje niektórych elementów interfejsu użytkownika programu Visual Studio w poniższych instrukcjach. Wersja programu Visual Studio i ustawienia, których używasz, określają te elementy. Aby uzyskać więcej informacji, zobacz Personalizowanie środowiska IDE.
- W drugim przewodniku zainstaluj program IronPython dla platformy .NET. Przejdź do strony Pobieranie , aby uzyskać najnowszą wersję.
Tworzenie niestandardowego obiektu dynamicznego
Pierwszy przewodnik definiuje niestandardowy obiekt dynamiczny, który przeszukuje zawartość pliku tekstowego. Właściwość dynamiczna określa tekst do wyszukania. Jeśli na przykład wywołanie kodu określa dynamicFile.Sample
, klasa dynamiczna zwraca ogólną listę ciągów, które zawierają wszystkie wiersze z pliku rozpoczynającego się od "Sample". Wyszukiwanie nie uwzględnia wielkości liter. Klasa dynamiczna obsługuje również dwa opcjonalne argumenty. Pierwszym argumentem jest wartość wyliczenia opcji wyszukiwania, która określa, że klasa dynamiczna powinna wyszukiwać dopasowania na początku wiersza, na końcu wiersza lub w dowolnym miejscu w wierszu. Drugi argument określa, że klasa dynamiczna powinna przycinać spacje wiodące i końcowe z każdego wiersza przed wyszukiwaniem. Jeśli na przykład wywołanie kodu określa dynamicFile.Sample(StringSearchOption.Contains)
, klasa dynamiczna wyszukuje ciąg "Sample" w dowolnym miejscu w wierszu. Jeśli kod wywołujący określa dynamicFile.Sample(StringSearchOption.StartsWith, false)
, klasa dynamiczna wyszukuje ciąg "Sample" na początku każdego wiersza i nie usuwa spacji wiodących i końcowych. Domyślne zachowanie klasy dynamicznej polega na wyszukiwaniu dopasowania na początku każdego wiersza i usuwaniu spacji wiodących i końcowych.
Tworzenie niestandardowej klasy dynamicznej
Uruchom program Visual Studio. Wybierz pozycję Utwórz nowy projekt. W oknie dialogowym Tworzenie nowego projektu wybierz pozycję C#, wybierz pozycję Aplikacja konsolowa, a następnie wybierz pozycję Dalej. W oknie dialogowym Konfigurowanie nowego projektu wprowadź DynamicSample
nazwę projektu, a następnie wybierz przycisk Dalej. W oknie dialogowym Dodatkowe informacje wybierz pozycję .NET 7.0 (bieżąca) dla platformy docelowej, a następnie wybierz pozycję Utwórz. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt DynamicSample i wybierz polecenie Dodaj>klasę. W polu Nazwa wpisz ReadOnlyFile
, a następnie wybierz pozycję Dodaj. W górnej części pliku ReadOnlyFile.cs lub ReadOnlyFile.vb dodaj następujący kod, aby zaimportować przestrzenie nazw System.IO i System.Dynamic.
using System.IO;
using System.Dynamic;
Niestandardowy obiekt dynamiczny wykorzystuje wyliczenie do określenia kryteriów wyszukiwania. Przed deklaracją klasy dodaj następującą definicję wyliczenia.
public enum StringSearchOption
{
StartsWith,
Contains,
EndsWith
}
Zaktualizuj instrukcję klasy, aby dziedziczyła klasę DynamicObject
, jak pokazano w poniższym przykładzie kodu.
class ReadOnlyFile : DynamicObject
Dodaj następujący kod do klasy, ReadOnlyFile
aby zdefiniować pole prywatne dla ścieżki pliku i konstruktor dla ReadOnlyFile
klasy.
// Store the path to the file and the initial line count value.
private string p_filePath;
// Public constructor. Verify that file exists and store the path in
// the private variable.
public ReadOnlyFile(string filePath)
{
if (!File.Exists(filePath))
{
throw new Exception("File path does not exist.");
}
p_filePath = filePath;
}
- Dodaj następującą
GetPropertyValue
metodę doReadOnlyFile
klasy . MetodaGetPropertyValue
przyjmuje jako dane wejściowe kryteria wyszukiwania i zwraca wiersze z pliku tekstowego zgodnego z kryteriami wyszukiwania. Metody dynamiczne dostarczane przez klasęReadOnlyFile
wywołają metodę ,GetPropertyValue
aby pobrać odpowiednie wyniki.
public List<string> GetPropertyValue(string propertyName,
StringSearchOption StringSearchOption = StringSearchOption.StartsWith,
bool trimSpaces = true)
{
StreamReader sr = null;
List<string> results = new List<string>();
string line = "";
string testLine = "";
try
{
sr = new StreamReader(p_filePath);
while (!sr.EndOfStream)
{
line = sr.ReadLine();
// Perform a case-insensitive search by using the specified search options.
testLine = line.ToUpper();
if (trimSpaces) { testLine = testLine.Trim(); }
switch (StringSearchOption)
{
case StringSearchOption.StartsWith:
if (testLine.StartsWith(propertyName.ToUpper())) { results.Add(line); }
break;
case StringSearchOption.Contains:
if (testLine.Contains(propertyName.ToUpper())) { results.Add(line); }
break;
case StringSearchOption.EndsWith:
if (testLine.EndsWith(propertyName.ToUpper())) { results.Add(line); }
break;
}
}
}
catch
{
// Trap any exception that occurs in reading the file and return null.
results = null;
}
finally
{
if (sr != null) {sr.Close();}
}
return results;
}
Po metodzie GetPropertyValue
dodaj następujący kod, aby nadpisać metodę TryGetMember klasy DynamicObject. Metoda TryGetMember jest wywoływana, gdy żądana jest składowa klasy dynamicznej i nie określono żadnych argumentów. Argument binder
zawiera informacje o przywoływanej składowej, a result
argument odwołuje się do wyniku zwróconego dla określonego członka. Metoda TryGetMember zwraca wartość logiczną: true
, jeśli żądany element członkowski istnieje; w przeciwnym razie zwraca false
.
// Implement the TryGetMember method of the DynamicObject class for dynamic member calls.
public override bool TryGetMember(GetMemberBinder binder,
out object result)
{
result = GetPropertyValue(binder.Name);
return result == null ? false : true;
}
Po metodzie TryGetMember
dodaj następujący kod, aby nadpisać metodę TryInvokeMember klasy DynamicObject. Metoda TryInvokeMember jest wywoływana, gdy element członkowski klasy dynamicznej jest żądany z argumentami. Argument binder
zawiera informacje o przywoływanej składowej, a result
argument odwołuje się do wyniku zwróconego dla określonego członka. Argument args
zawiera tablicę argumentów przekazywanych do elementu. Metoda TryInvokeMember zwraca wartość logiczną: true
, jeśli żądany element członkowski istnieje; w przeciwnym razie zwraca false
.
Niestandardowa wersja TryInvokeMember
metody oczekuje, że pierwszy argument będzie wartością z StringSearchOption
wyliczenia zdefiniowanego w poprzednim kroku. Metoda TryInvokeMember
oczekuje, że drugi argument będzie wartością logiczną. Jeśli jeden lub oba argumenty są prawidłowymi wartościami, są przekazywane do GetPropertyValue
metody w celu pobrania wyników.
// Implement the TryInvokeMember method of the DynamicObject class for
// dynamic member calls that have arguments.
public override bool TryInvokeMember(InvokeMemberBinder binder,
object[] args,
out object result)
{
StringSearchOption StringSearchOption = StringSearchOption.StartsWith;
bool trimSpaces = true;
try
{
if (args.Length > 0) { StringSearchOption = (StringSearchOption)args[0]; }
}
catch
{
throw new ArgumentException("StringSearchOption argument must be a StringSearchOption enum value.");
}
try
{
if (args.Length > 1) { trimSpaces = (bool)args[1]; }
}
catch
{
throw new ArgumentException("trimSpaces argument must be a Boolean value.");
}
result = GetPropertyValue(binder.Name, StringSearchOption, trimSpaces);
return result == null ? false : true;
}
Zapisz i zamknij plik.
Tworzenie przykładowego pliku tekstowego
W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt DynamicSample i wybierz pozycję Dodaj>nowy element. W okienku Zainstalowane szablony wybierz pozycję Ogólne, a następnie wybierz szablon Plik tekstowy . Pozostaw domyślną nazwę TextFile1.txt w polu Nazwa , a następnie wybierz pozycję Dodaj. Skopiuj następujący tekst do pliku 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
Zapisz i zamknij plik.
Tworzenie przykładowej aplikacji korzystającej z niestandardowego obiektu dynamicznego
W Eksploratorze rozwiązań kliknij dwukrotnie plik Program.cs . Dodaj następujący kod do procedury, Main
aby utworzyć wystąpienie ReadOnlyFile
klasy dla pliku TextFile1.txt . Kod używa opóźnionego powiązania do wywoływania dynamicznych elementów i pobierania linii tekstu zawierających ciąg "Klient".
dynamic rFile = new ReadOnlyFile(@"..\..\..\TextFile1.txt");
foreach (string line in rFile.Customer)
{
Console.WriteLine(line);
}
Console.WriteLine("----------------------------");
foreach (string line in rFile.Customer(StringSearchOption.Contains, true))
{
Console.WriteLine(line);
}
Zapisz plik i naciśnij Ctrl+F5 , aby skompilować i uruchomić aplikację.
Wywoływanie biblioteki językowej dynamicznej
Poniższy przewodnik tworzy projekt, który uzyskuje dostęp do biblioteki napisanej w języku dynamicznym IronPython.
Aby utworzyć niestandardową klasę dynamiczną
W programie Visual Studio wybierz pozycje Plik>Nowy>Projekt. W oknie dialogowym Tworzenie nowego projektu wybierz pozycję C#, wybierz pozycję Aplikacja konsolowa, a następnie wybierz pozycję Dalej. W oknie dialogowym Konfigurowanie nowego projektu wprowadź DynamicIronPythonSample
nazwę projektu, a następnie wybierz przycisk Dalej. W oknie dialogowym Dodatkowe informacje wybierz pozycję .NET 7.0 (bieżąca) dla platformy docelowej, a następnie wybierz pozycję Utwórz. Zainstaluj pakiet NuGet IronPython . Edytuj plik Program.cs . Na początku pliku dodaj następujący kod, aby zaimportować przestrzenie nazw Microsoft.Scripting.Hosting
i IronPython.Hosting
z bibliotek IronPython oraz przestrzeń nazw System.Linq
.
using System.Linq;
using Microsoft.Scripting.Hosting;
using IronPython.Hosting;
W metodzie Main dodaj następujący kod, aby utworzyć nowy Microsoft.Scripting.Hosting.ScriptRuntime
obiekt do hostowania bibliotek IronPython. Obiekt ScriptRuntime
ładuje moduł biblioteki 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");
ScriptRuntime py = Python.CreateRuntime();
dynamic random = py.UseFile("random.py");
Console.WriteLine("random.py loaded.");
Po załadowaniu kodu modułu random.py dodaj następujący kod, aby utworzyć tablicę liczb całkowitych. Tablica jest przekazywana do shuffle
metody modułu random.py, który losowo sortuje wartości w tablicy.
// Initialize an enumerable set of integers.
int[] items = Enumerable.Range(1, 7).ToArray();
// Randomly shuffle the array of integers by using IronPython.
for (int i = 0; i < 5; i++)
{
random.shuffle(items);
foreach (int item in items)
{
Console.WriteLine(item);
}
Console.WriteLine("-------------------");
}
Zapisz plik i naciśnij Ctrl+F5 , aby skompilować i uruchomić aplikację.