İzlenecek yol: C'de Dinamik Nesneler Oluşturma ve Kullanma#
Dinamik nesneler, derleme zamanında değil, çalışma zamanında özellikler ve yöntemler gibi üyeleri kullanıma sunar. Dinamik nesneler, statik bir tür veya biçimle eşleşmeyen yapılarla çalışacak nesneler oluşturmanıza olanak tanır. Örneğin, geçerli HTML işaretleme öğelerinin ve özniteliklerinin herhangi bir bileşimini içerebilen HTML Belge Nesne Modeli'ne (DOM) başvurmak için dinamik bir nesne kullanabilirsiniz. Her HTML belgesi benzersiz olduğundan, belirli bir HTML belgesinin üyeleri çalışma zamanında belirlenir. HTML öğesinin özniteliğine başvurmak için kullanılan yaygın bir yöntem, özniteliğin adını öğesinin GetProperty
yöntemine geçirmektir. HTML öğesinin özniteliğine id
başvurmak için <div>
önce öğesine <div id="Div1">
bir başvuru alırsınız ve sonra kullanırsınızdivElement.GetProperty("id")
. Dinamik bir nesne kullanıyorsanız özniteliğine id
olarak divElement.id
başvurabilirsiniz.
Dinamik nesneler ayrıca IronPython ve IronRuby gibi dinamik dillere kolay erişim sağlar. Çalışma zamanında yorumlanan dinamik betiklere başvurmak için dinamik bir nesne kullanabilirsiniz.
Geç bağlama kullanarak dinamik bir nesneye başvurursunuz. Geç bağlanan nesnenin türünü olarak dynamic
belirtirsiniz. Daha fazla bilgi için bkz . dinamik.
Ad alanında sınıfları System.Dynamic kullanarak özel dinamik nesneler oluşturabilirsiniz. Örneğin, bir ExpandoObject oluşturabilir ve çalışma zamanında bu nesnenin üyelerini belirtebilirsiniz. Sınıfı devralan DynamicObject kendi türünüzü de oluşturabilirsiniz. Daha sonra, çalışma zamanı dinamik işlevselliği sağlamak için sınıfın DynamicObject üyelerini geçersiz kılabilirsiniz.
Bu makalede iki bağımsız izlenecek yol bulunur:
- Metin dosyasının içeriğini bir nesnenin özellikleri olarak dinamik olarak kullanıma sunan özel bir nesne oluşturun.
- Kitaplık kullanan bir
IronPython
proje oluşturun.
Önkoşullar
- .NET masaüstü geliştirme iş yükünün yüklü olduğu Visual Studio 2022 sürüm 17.3 veya sonraki bir sürüm. Bu iş yükünü seçtiğinizde .NET 7 SDK'sı eklenir.
Not
Bilgisayarınız, aşağıdaki yönergelerde yer alan Visual Studio kullanıcı arabirimi öğelerinden bazıları için farklı adlar veya konumlar gösterebilir. Sahip olduğunuz Visual Studio sürümü ve kullandığınız ayarlar bu öğeleri belirler. Daha fazla bilgi için bkz. IDE’yi kişiselleştirme.
- İkinci kılavuz için .NET için IronPython'u yükleyin. En son sürümü edinmek için İndirme sayfasına gidin.
Özel Dinamik Nesne Oluşturma
İlk izlenecek yol, bir metin dosyasının içeriğini arayan özel bir dinamik nesne tanımlar. Dinamik özellik, aranacak metni belirtir. Örneğin, çağıran kod belirtiyorsa dynamicFile.Sample
, dinamik sınıf dosyadan "Örnek" ile başlayan tüm satırları içeren genel bir dize listesi döndürür. Arama büyük/küçük harfe duyarlı değildir. Dinamik sınıf, isteğe bağlı iki bağımsız değişkeni de destekler. İlk bağımsız değişken, dinamik sınıfın satırın başında, sonunda veya satırda herhangi bir yerde eşleşme araması gerektiğini belirten bir arama seçeneği numaralandırma değeridir. İkinci bağımsız değişken, dinamik sınıfın aramadan önce her satırdaki baştaki ve sondaki boşlukları kırpması gerektiğini belirtir. Örneğin, çağıran kod belirtiyorsa dynamicFile.Sample(StringSearchOption.Contains)
dinamik sınıf bir satırda herhangi bir yerde "Örnek" arar. Kod çağrılırsa dynamicFile.Sample(StringSearchOption.StartsWith, false)
, dinamik sınıf her satırın başında "Örnek" ifadesini arar ve baştaki ve sondaki boşlukları kaldırmaz. Dinamik sınıfın varsayılan davranışı, her satırın başında bir eşleşme aramak ve baştaki ve sondaki boşlukları kaldırmaktır.
Özel dinamik sınıf oluşturma
Visual Studio’yu çalıştırın. Yeni proje oluştur'u seçin. Yeni proje oluştur iletişim kutusunda C# seçeneğini belirleyin, Konsol Uygulaması'nı ve ardından İleri'yi seçin. Yeni projenizi yapılandırın iletişim kutusunda Proje adı olarak girin DynamicSample
ve İleri'yi seçin. Ek bilgi iletişim kutusunda Hedef Çerçeve için .NET 7.0 (Geçerli) öğesini ve ardından Oluştur'u seçin. Çözüm Gezgini'da DynamicSample projesine sağ tıklayın ve Sınıf Ekle'yi>seçin. Ad kutusuna yazın ReadOnlyFile
ve Ekle'yi seçin. ReadOnlyFile.cs veya ReadOnlyFile.vb dosyasının en üstüne ve System.Dynamic ad alanlarını içeri aktarmak System.IO için aşağıdaki kodu ekleyin.
using System.IO;
using System.Dynamic;
Özel dinamik nesne, arama ölçütlerini belirlemek için bir sabit listesi kullanır. sınıf deyiminden önce aşağıdaki sabit listesi tanımını ekleyin.
public enum StringSearchOption
{
StartsWith,
Contains,
EndsWith
}
Sınıf deyimini, aşağıdaki kod örneğinde gösterildiği gibi sınıfı devralacak DynamicObject
şekilde güncelleştirin.
class ReadOnlyFile : DynamicObject
Dosya yolu için özel bir alan ve sınıf için bir oluşturucu tanımlamak için sınıfına ReadOnlyFile
aşağıdaki kodu ReadOnlyFile
ekleyin.
// 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;
}
ReadOnlyFile
sınıfına aşağıdakiGetPropertyValue
yöntemini ekleyin.GetPropertyValue
yöntemi, giriş olarak arama ölçütlerini alır ve bu arama ölçütlerine uyan bir metin dosyasındaki satırları döndürür. sınıfı tarafındanReadOnlyFile
sağlanan dinamik yöntemler, ilgili sonuçlarını almak için yöntemini çağırırGetPropertyValue
.
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;
}
yönteminden GetPropertyValue
sonra, sınıfının yöntemini DynamicObject geçersiz kılmak TryGetMember için aşağıdaki kodu ekleyin. Bir TryGetMember dinamik sınıfın üyesi istendiğinde ve hiçbir bağımsız değişken belirtilmediğinde yöntemi çağrılır. Bağımsız binder
değişken, başvuruda bulunan üye hakkında bilgi içerir ve result
bağımsız değişken, belirtilen üye için döndürülen sonuda başvurur. yöntemi, TryGetMember istenen üye varsa döndüren true
bir Boole değeri döndürür; aksi takdirde döndürür 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;
}
yönteminden TryGetMember
sonra, sınıfının yöntemini DynamicObject geçersiz kılmak TryInvokeMember için aşağıdaki kodu ekleyin. Bir TryInvokeMember dinamik sınıfın üyesi bağımsız değişkenlerle istendiğinde yöntemi çağrılır. Bağımsız binder
değişken, başvuruda bulunan üye hakkında bilgi içerir ve result
bağımsız değişken, belirtilen üye için döndürülen sonuda başvurur. bağımsız args
değişkeni, üyeye geçirilen bağımsız değişkenlerin bir dizisini içerir. yöntemi, TryInvokeMember istenen üye varsa döndüren true
bir Boole değeri döndürür; aksi takdirde döndürür false
.
Yöntemin TryInvokeMember
özel sürümü, ilk bağımsız değişkenin önceki adımda tanımladığınız sabit listesinden bir değer StringSearchOption
olmasını bekler. yöntemi, TryInvokeMember
ikinci bağımsız değişkenin Boole değeri olmasını bekler. Bağımsız değişkenlerden biri veya her ikisi de geçerli değerlerse, sonuçları almak için yöntemine geçirilir GetPropertyValue
.
// 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;
}
Dosyayı kaydedip kapatın
Örnek metin dosyası oluşturma
Çözüm Gezgini'da DynamicSample projesine sağ tıklayın ve Yeni Öğe Ekle'yi>seçin. Yüklü Şablonlar bölmesinde Genel'i ve ardından Metin Dosyası şablonunu seçin. Ad kutusunda varsayılan TextFile1.txt adını bırakın ve Ekle'yi seçin. Aşağıdaki metni TextFile1.txt dosyasına kopyalayın.
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
Dosyayı kaydedip kapatın
Özel dinamik nesneyi kullanan örnek bir uygulama oluşturma
Çözüm Gezgini'da Program.cs dosyasına çift tıklayın. TextFile1.txt dosyasının Main
sınıfının bir örneğini ReadOnlyFile
oluşturmak için yordama aşağıdaki kodu ekleyin. Kod, dinamik üyeleri çağırmak ve "Customer" dizesini içeren metin satırlarını almak için geç bağlama kullanır.
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);
}
Dosyayı kaydedin ve uygulamayı derlemek ve çalıştırmak için Ctrl+F5 tuşlarına basın.
Dinamik dil kitaplığı çağırma
Aşağıdaki kılavuz, ironpython dinamik dilinde yazılmış bir kitaplığa erişen bir proje oluşturur.
Özel dinamik sınıf oluşturmak için
Visual Studio'da Dosya>Yeni Proje'yi> seçin. Yeni proje oluştur iletişim kutusunda C# seçeneğini belirleyin, Konsol Uygulaması'nı ve ardından İleri'yi seçin. Yeni projenizi yapılandırın iletişim kutusunda Proje adı olarak girin DynamicIronPythonSample
ve İleri'yi seçin. Ek bilgi iletişim kutusunda Hedef Çerçeve için .NET 7.0 (Geçerli) öğesini ve ardından Oluştur'u seçin. IronPython NuGet paketini yükleyin. Program.cs dosyasını düzenleyin. Dosyanın en üstüne ironpython kitaplıklarından System.Linq
ve ad alanından ve IronPython.Hosting
ad alanlarını içeri aktarmak Microsoft.Scripting.Hosting
için aşağıdaki kodu ekleyin.
using System.Linq;
using Microsoft.Scripting.Hosting;
using IronPython.Hosting;
Main yöntemine aşağıdaki kodu ekleyerek IronPython kitaplıklarını barındıracak yeni Microsoft.Scripting.Hosting.ScriptRuntime
bir nesne oluşturun. ScriptRuntime
nesnesi IronPython kitaplık modülünü random.py yükler.
// 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.");
random.py modülünü yüklemek için koddan sonra aşağıdaki kodu ekleyerek bir tamsayı dizisi oluşturun. Dizi, dizideki shuffle
değerleri rastgele sıralayan random.py modülünün yöntemine geçirilir.
// 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("-------------------");
}
Dosyayı kaydedin ve uygulamayı derlemek ve çalıştırmak için Ctrl+F5 tuşlarına basın.