Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Objek dinamis mengekspos anggota seperti properti dan metode pada waktu proses, bukan pada waktu kompilasi. Objek dinamis memungkinkan Anda membuat objek untuk bekerja dengan struktur yang tidak cocok dengan jenis atau format statis. Misalnya, Anda dapat menggunakan objek dinamis untuk mereferensikan HTML Document Object Model (DOM), yang dapat berisi kombinasi elemen dan atribut markup HTML yang valid. Karena setiap dokumen HTML unik, anggota untuk dokumen HTML tertentu ditentukan pada waktu proses. Metode umum untuk mereferensikan atribut elemen HTML adalah meneruskan nama atribut ke GetProperty
metode elemen . Untuk mereferensikan atribut id
dari elemen HTML <div id="Div1">
, pertama-tama Anda harus mendapatkan referensi ke elemen <div>
, lalu gunakan divElement.GetProperty("id")
. Jika Anda menggunakan objek dinamis, Anda dapat mereferensikan id
atribut sebagai divElement.id
.
Objek dinamis juga menyediakan akses mudah ke bahasa dinamis seperti IronPython dan IronRuby. Anda dapat menggunakan objek dinamis untuk merujuk ke skrip dinamis yang ditafsirkan pada waktu proses.
Anda mereferensikan objek dinamis dengan menggunakan pengikatan terlambat. Anda menentukan tipe objek pengikatan lambat sebagai dynamic
. Untuk informasi selengkapnya, lihat dinamis.
Anda dapat membuat objek dinamis kustom dengan menggunakan kelas di namespace System.Dynamic. Misalnya, Anda dapat membuat ExpandoObject dan menentukan anggota objek tersebut pada waktu proses. Anda juga dapat membuat tipe Anda sendiri yang mewarisi kelas DynamicObject. Anda kemudian dapat mengganti anggota kelas DynamicObject untuk menyediakan fungsionalitas dinamis run-time.
Artikel ini berisi dua panduan independen:
- Buat objek kustom yang secara dinamis mengekspos konten file teks sebagai properti objek.
- Buat sebuah proyek yang menggunakan pustaka
IronPython
.
Prasyarat
- Visual Studio 2022 versi 17.3 atau versi yang lebih baru dengan beban kerja pengembangan desktop .NET terinstal. .NET 7 SDK disertakan saat Anda memilih beban kerja ini.
Nota
Komputer Anda mungkin menampilkan nama atau lokasi yang berbeda untuk beberapa elemen antarmuka pengguna Visual Studio dalam instruksi berikut. Edisi Visual Studio yang Anda miliki dan pengaturan yang Anda gunakan menentukan elemen-elemen ini. Untuk informasi lebih lanjut, lihat Mempersonalisasi IDE.
- Untuk panduan kedua, instal IronPython untuk .NET. Buka halaman Unduhan mereka untuk mendapatkan versi terbaru.
Membuat Objek Dinamis Kustom
Panduan pertama menentukan objek dinamis kustom yang mencari konten file teks. Properti dinamis menentukan teks yang akan dicari. Misalnya, jika kode panggilan menentukan dynamicFile.Sample
, kelas dinamis mengembalikan daftar umum string yang berisi semua baris dari file yang dimulai dengan "Sampel". Pencarian tidak peka huruf besar/kecil. Kelas dinamis juga mendukung dua argumen opsional. Argumen pertama adalah nilai enum opsi pencarian yang menentukan bahwa kelas dinamis harus mencari kecocokan di awal baris, akhir baris, atau di mana saja dalam baris. Argumen kedua menentukan bahwa kelas dinamis harus memangkas spasi di depan dan di belakang dari setiap baris sebelum mencari. Misalnya, jika kode panggilan menentukan dynamicFile.Sample(StringSearchOption.Contains)
, kelas dinamis mencari "Sampel" di mana saja dalam satu baris. Jika kode panggilan menentukan dynamicFile.Sample(StringSearchOption.StartsWith, false)
, kelas dinamis mencari "Sampel" di awal setiap baris, dan tidak menghapus spasi di awal dan belakang. Perilaku default kelas dinamis adalah mencari kecocokan di awal setiap baris dan untuk menghapus spasi di awal dan akhir.
Membuat kelas dinamis kustom
Mulai Visual Studio. Pilih Buat proyek baru. Dalam dialog Buat proyek baru , pilih C#, pilih Aplikasi Konsol, lalu pilih Berikutnya. Dalam dialog Konfigurasikan proyek baru Anda , masukkan DynamicSample
untuk Nama proyek, lalu pilih Berikutnya. Dalam dialog Informasi tambahan , pilih .NET 7.0 (Saat Ini) untuk Kerangka Kerja Target, lalu pilih Buat. Di Penjelajah Solusi, klik kanan proyek DynamicSample dan pilih Tambahkan>Kelas. Dalam kotak Nama , ketik ReadOnlyFile
, lalu pilih Tambahkan. Di bagian atas file ReadOnlyFile.cs atau ReadOnlyFile.vb, tambahkan kode berikut untuk mengimpor namespace System.IO dan System.Dynamic.
using System.IO;
using System.Dynamic;
Objek dinamis kustom menggunakan enum untuk menentukan kriteria pencarian. Sebelum pernyataan kelas, tambahkan definisi enum berikut.
public enum StringSearchOption
{
StartsWith,
Contains,
EndsWith
}
Perbarui pernyataan kelas untuk mewarisi kelas DynamicObject
, seperti yang ditunjukkan dalam contoh kode berikut.
class ReadOnlyFile : DynamicObject
Tambahkan kode berikut ke ReadOnlyFile
kelas untuk menentukan bidang privat untuk jalur file dan konstruktor untuk ReadOnlyFile
kelas .
// 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;
}
- Tambahkan metode berikut
GetPropertyValue
keReadOnlyFile
kelas . Metode iniGetPropertyValue
mengambil kriteria pencarian sebagai input dan mengembalikan baris-baris dari file teks yang sesuai dengan kriteria tersebut. Metode dinamis yang disediakan oleh kelasReadOnlyFile
memanggil metodeGetPropertyValue
untuk mengambil hasil masing-masing.
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;
}
Setelah metode GetPropertyValue
, tambahkan kode berikut untuk meng-override metode TryGetMember dari kelas DynamicObject. Metode TryGetMember ini dipanggil ketika anggota kelas dinamis diminta dan tidak ada argumen yang ditentukan. Argumen binder
berisi informasi tentang anggota yang direferensikan, dan result
argumen mereferensikan hasil yang dikembalikan untuk anggota yang ditentukan. Metode TryGetMember mengembalikan nilai Boolean dan mengembalikan true
jika anggota yang diminta ada; jika tidak, metode mengembalikan 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;
}
Setelah metode TryGetMember
, tambahkan kode berikut untuk meng-override metode TryInvokeMember dari kelas DynamicObject. Metode TryInvokeMember ini dipanggil ketika anggota kelas dinamis diminta dengan argumen. Argumen binder
berisi informasi tentang anggota yang direferensikan, dan result
argumen mereferensikan hasil yang dikembalikan untuk anggota yang ditentukan. Argumen args
berisi array argumen yang diteruskan ke anggota. Metode TryInvokeMember mengembalikan nilai Boolean dan mengembalikan true
jika anggota yang diminta ada; jika tidak, metode mengembalikan false
.
Versi TryInvokeMember
kustom metode mengharapkan argumen pertama menjadi nilai dari StringSearchOption
enum yang Anda tentukan di langkah sebelumnya. Metode TryInvokeMember
mengharapkan argumen kedua menjadi nilai Boolean. Jika satu atau kedua argumen adalah nilai yang valid, argumen tersebut diteruskan ke GetPropertyValue
metode untuk mengambil hasilnya.
// 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;
}
Simpan dan tutup file.
Membuat file teks sampel
Di Penjelajah Solusi, klik kanan proyek DynamicSample dan pilih Tambahkan>Item Baru. Di panel Templat terinstal , pilih Umum, lalu pilih templat File Teks . Biarkan nama default TextFile1.txt dalam kotak Nama , lalu pilih Tambahkan. Salin teks berikut ke file 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
Simpan dan tutup file.
Membuat aplikasi sampel yang menggunakan objek dinamis kustom
Di Penjelajah Solusi, klik dua kali file Program.cs . Tambahkan kode berikut ke Main
prosedur untuk membuat instans ReadOnlyFile
kelas untuk file TextFile1.txt . Kode ini menggunakan pengikatan terlambat untuk memanggil anggota dinamis dan mengambil baris teks yang berisi string "Pelanggan".
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);
}
Simpan file dan tekan Ctrl+F5 untuk membuat dan menjalankan aplikasi.
Memanggil pustaka bahasa dinamis
Panduan berikut membuat proyek yang mengakses pustaka yang ditulis dalam bahasa dinamis IronPython.
Untuk membuat kelas dinamis kustom
Di Visual Studio, pilih File>Baru>Proyek. Dalam dialog Buat proyek baru , pilih C#, pilih Aplikasi Konsol, lalu pilih Berikutnya. Dalam dialog Konfigurasikan proyek baru Anda , masukkan DynamicIronPythonSample
untuk Nama proyek, lalu pilih Berikutnya. Dalam dialog Informasi tambahan , pilih .NET 7.0 (Saat Ini) untuk Kerangka Kerja Target, lalu pilih Buat. Instal paket IronPython NuGet. Edit file Program.cs . Di bagian atas file, tambahkan kode berikut untuk mengimpor namespace Microsoft.Scripting.Hosting
dan IronPython.Hosting
dari pustaka IronPython serta namespace System.Linq
.
using System.Linq;
using Microsoft.Scripting.Hosting;
using IronPython.Hosting;
Dalam metode Utama, tambahkan kode berikut untuk membuat objek baru Microsoft.Scripting.Hosting.ScriptRuntime
untuk menghosting pustaka IronPython. Objek ScriptRuntime
memuat modul pustaka 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.");
Setelah kode untuk memuat modul random.py, tambahkan kode berikut untuk membuat array bilangan bulat. Array diteruskan ke shuffle
metode modul random.py, yang secara acak mengurutkan nilai dalam array.
// 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("-------------------");
}
Simpan file dan tekan Ctrl+F5 untuk membuat dan menjalankan aplikasi.