Aracılığıyla paylaş


İzlenecek yol: Visual Basic'te 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. Bu, 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 id="Div1"> önce öğesine <div>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 Objectbelirtirsiniz. Daha fazla bilgi için bkz. [Erken ve Geç Bağlama.

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.

Bunlardan birini veya ikisini birden yapabilirsiniz ve her ikisini de yaparsanız, siparişin bir önemi yoktur.

Önkoşullar

  • .NET masaüstü geliştirme iş yükünün yüklü olduğu Visual Studio 2019 sürüm 16.9 veya sonraki bir sürüm. Bu iş yükünü seçtiğinizde .NET 5 SDK'sı otomatik olarak yüklenir.

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şturmak için

  1. Visual Studio'yu başlatın.

  2. Yeni proje oluştur'u seçin.

  3. Yeni proje oluştur iletişim kutusunda Visual Basic'i, Konsol Uygulaması'nı ve ardından İleri'yi seçin.

  4. Yeni projenizi yapılandırın iletişim kutusunda Proje adıDynamicSamplegirin ve İleri'yi seçin.

  5. Ek bilgi iletişim kutusunda Hedef Çerçeve için .NET 5.0 (Geçerli) öğesini ve ardından Oluştur'u seçin.

    Yeni proje oluşturulur.

  6. Çözüm Gezgini'da DynamicSample projesine sağ tıklayın ve Sınıf. Ad kutusuna yazın ReadOnlyFileve Ekle'yi seçin.

    ReadOnlyFile sınıfını içeren yeni bir dosya eklenir.

  7. ReadOnlyFile.cs veya ReadOnlyFile.vb dosyasının en üstüne ve System.IO ad alanlarını içeri aktarmak System.Dynamic için aşağıdaki kodu ekleyin.

    Imports System.IO
    Imports System.Dynamic
    
  8. Ö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
    End Enum
    
  9. Sınıf deyimini, aşağıdaki kod örneğinde gösterildiği gibi sınıfı devralacak DynamicObject şekilde güncelleştirin.

    Public Class ReadOnlyFile
        Inherits DynamicObject
    
  10. 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 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 Sub
    
  11. GetPropertyValue sınıfına aşağıdaki ReadOnlyFile 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 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 Function
    
  12. yönteminden GetPropertyValue sonra, sınıfının yöntemini TryGetMember geçersiz kılmak DynamicObject 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 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 Function
    
  13. yönteminden TryGetMember sonra, sınıfının yöntemini TryInvokeMember geçersiz kılmak DynamicObject 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 GetPropertyValue geçirilir.

    ' 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 Function
    
  14. Dosyayı kaydedip kapatın

Örnek metin dosyası oluşturmak için

  1. Çözüm Gezgini'da DynamicSample projesine sağ tıklayın ve Yeni Öğe. 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'ye tıklayın. Projeye yeni bir metin dosyası eklenir.

  2. 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
    
  3. Dosyayı kaydedip kapatın

Özel dinamik nesnesini kullanan örnek bir uygulama oluşturmak için

  1. Çözüm Gezgini'da Program.vb dosyasına çift tıklayın.

  2. 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.

    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)
    Next
    
  3. Dosyayı kaydedin ve uygulamayı derlemek ve çalıştırmak için Ctrl

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

  1. Visual Studio'da DosyaYeni Proje'yi>> seçin.

  2. Yeni proje oluştur iletişim kutusunda Visual Basic'i, Konsol Uygulaması'nı ve ardından İleri'yi seçin.

  3. Yeni projenizi yapılandırın iletişim kutusunda Proje adıDynamicIronPythonSamplegirin ve İleri'yi seçin.

  4. Ek bilgi iletişim kutusunda Hedef Çerçeve için .NET 5.0 (Geçerli) öğesini ve ardından Oluştur'u seçin.

    Yeni proje oluşturulur.

  5. IronPython NuGet paketini yükleyin.

  6. Program.vb dosyasını düzenleyin.

  7. Dosyanın en üstüne ironpython kitaplıklarından Microsoft.Scripting.Hosting ve ad alanından ve IronPython.Hosting ad alanlarını içeri aktarmak System.Linq için aşağıdaki kodu ekleyin.

    Imports Microsoft.Scripting.Hosting
    Imports IronPython.Hosting
    Imports System.Linq
    
  8. 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")
    Dim py = Python.CreateRuntime()
    Dim random As Object = py.UseFile("random.py")
    Console.WriteLine("random.py loaded.")
    
  9. 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.
    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("-------------------")
    Next
    
  10. Dosyayı kaydedin ve uygulamayı derlemek ve çalıştırmak için Ctrl

Ayrıca bkz.