İ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.idbaş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 dynamicbelirtirsiniz. 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

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.

Ö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 ReadOnlyFileve 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;
}
  1. ReadOnlyFile sınıfına aşağıdaki GetPropertyValue 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ından ReadOnlyFile sağlanan dinamik yöntemler, ilgili sonuçlarını almak için yöntemini çağırır GetPropertyValue .
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.

Ayrıca bkz.