Aracılığıyla paylaş


İzlenecek yol: Dinamik Nesneler Oluşturma ve Kullanma (C# and Visual Basic)

Dinamik nesneleri özellikler ve yöntemler gibi üyeleri çalışma zamanında yerine, derleme zamanında açarsınız.Bu, statik türde veya biçim eşleşmeyen yapýlarýyla çalýþmak için nesneler oluşturmanıza olanak sağlar.Örneğin, bir dinamik nesne html Belge Nesne Modeli (herhangi bir birleşimi geçerli html biçimlendirme öğeleri ve öznitelikleri içerebilen dom), başvurmak için kullanabilirsiniz.Her html belgesinde benzersiz olduğu için belirli bir html belgesi üyeleri zamanında belirlenir.html öğesinin öznitelik başvurmak için kullanılan genel yöntem için öznitelik adı geçirmektir GetProperty yöntemi, öğe.Başvuru için id html ögesinin özniteliği <div id="Div1">, ilk başvuru elde <div> öğesini ve sonra kullanım divElement.GetProperty("id").Dinamik nesne kullanırsanız, başvuru id olarak özniteliği divElement.id.

Dinamik nesneleri de dinamik dillerin IronPython ve IronRuby gibi kolay erişim sağlar.Dinamik nesne çalışma zamanında yorumlandığı dinamik bir komut dosyası belirtmek için kullanabilirsiniz.

Geç bağlama kullanarak bir dinamik nesne başvurusu.C# [NULL]'ta geç bağlama nesnesi olarak türünü belirtmek dynamic.İçinde Visual Basic, geç bağlama nesnesi olarak türünü belirtmek Object.Daha fazla bilgi için, bkz. Dinamik (C# Reference) ve (Visual Basic) erken ve geç bağlama.

Dinamik nesneleri özel sınıfları kullanarak oluşturmak System.Dynamic ad alanı.Örneğin, oluşturma bir ExpandoObject ve çalışma zamanında o nesnenin üyelerini belirtin.Devralan kendi türü de oluşturabilirsiniz DynamicObject sınıf.Sonra üyelerini kılabilirsiniz DynamicObject dinamik çalışma zamanı işlevlerini sağlayan sınıf.

Bu yönergede aşağıdaki görevleri gerçekleştirmeniz gerekmektedir:

  • Nesne özellikleri olarak bir metin dosyasının içeriğini dinamik olarak sunan özel bir nesne oluşturun.

  • Kullanan bir proje oluşturmak bir IronPython kitaplığı.

Önkoşullar

Bu yönergeyi tamamlamak .NET 4.0 için 2.6.1 IronPython, gerekir.Gelen 2.6.1 IronPython .NET 4.0 karşıdan yükleyebileceğiniz CodePlex.

[!NOT]

Bilgisayarınızda, aşağıdaki yönergelerde yer alan Visual Studio kullanıcı arabirimi öğelerinden bazılarının adı veya konumu farklı gösterilebilir. Bu öğeleri bilgisayarınızdaki Visual Studio sürümü ve kullandığınız ayarlar belirler. Daha fazla bilgi için bkz: Visual Studio ayarları.

Özel dinamik nesne oluşturma

Bu anlatımda oluşturduğunuz ilk projenin bir metin dosyasının içeriğini arar özel bir dinamik nesne tanımlar.Metin aramak için dinamik bir özellik adı tarafından belirtilir.Örneğin, kod çağırma, belirtir dynamicFile.Sample, dinamik bir sınıf içeren tüm "Sample" ile başlayan satırlar dosyadan genel dizeleri listesini döndürür.Arama büyük/küçük harf duyarlıdır.Dinamik sınıf iki isteğe bağlı bağımsız değişkenler de destekler.İlk bağımsız değişken dinamik sınıf için son satırın veya herhangi bir yere satır satır başında eşleşir aramak belirten bir arama seçeneği numaralama değerdir.İkinci bağımsız değişken dinamik sınıf, baştaki ve sondaki boşluk her satırından aramadan önce kesim belirtir.Örneğin, kod çağırma, belirtir dynamicFile.Sample(StringSearchOption.Contains), dinamik sınıf arar "Örnek" için herhangi bir yere bir satır.Kodu çağırma belirtir dynamicFile.Sample(StringSearchOption.StartsWith, false), dinamik sınıf her satırın başındaki "Sample" arar ve baştaki ve sondaki kaldırmaz.Dinamik sınıf varsayılan davranışı her satırın başındaki bir eşleşme aramak için ve baştaki ve sondaki boşlukları kaldırmak için ' dir.

Özel dinamik bir sınıf oluşturmak için

  1. Visual Studio uygulamasını başlatın.

  2. Dosya menüsünde, Yeni'nin üzerine gelin ve Proje'yi tıklayın.

  3. İçinde Yeni bir proje iletişim kutusunda Proje türleri bölmesi, emin olun Windows seçilir.Seçin Konsol uygulaması , şablonları bölmesi.İçinde adı yazın DynamicSample[NULL]'ı Tamam.Yeni Proje oluşturulur.

  4. DynamicSample projesini sağ tıklatın ve işaret Ekle[NULL]'ı sınıfı.İçinde adı yazın ReadOnlyFile[NULL]'ı Tamam.ReadOnlyFile sınıfı içeren yeni bir dosya eklenir.

  5. ReadOnlyFile.cs veya ReadOnlyFile.vb dosyası üstünde almak için aşağıdaki kodu ekleyin System.IO ve System.Dynamic ad.

    Imports System.IO
    Imports System.Dynamic
    
    using System.IO;
    using System.Dynamic;
    
  6. Özel dinamik nesne bir enum arama ölçütlerini belirlemek için kullanır.Aşağıdaki numaralandırma tanımı sınıf deyiminin önüne ekleyin.

    Public Enum StringSearchOption
        StartsWith
        Contains
        EndsWith
    End Enum
    
    public enum StringSearchOption
    {
        StartsWith,
        Contains,
        EndsWith
    }
    
  7. Update devralması için sınıf deyimi DynamicObject sınıfı, aşağıdaki kod örneğinde gösterildiği gibi.

    Public Class ReadOnlyFile
        Inherits DynamicObject
    
    class ReadOnlyFile : DynamicObject
    
  8. Aşağıdaki kodu ekleyip ReadOnlyFile da dosya yolu için özel bir alan ve bir kurucusu tanımlamak için sınıf ReadOnlyFile sınıf.

    ' 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
    
    // 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;
    }
    
  9. Aşağıdaki GetPropertyValue yöntemine ReadOnlyFile sınıf.GetPropertyValue Giriş, arama ölçütü olarak yöntemi alır ve dosya arama ölçütlerine uyan bir metinden satırları döndürür.Tarafından sağlanan dinamik yöntemleri ReadOnlyFile çağrı sınıfı GetPropertyValue ilgili sonuçları almak için yöntem.

    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
    
    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;
    }
    
  10. Sonra GetPropertyValue yöntemini geçersiz kılmak için aşağıdaki kodu ekleyip TryGetMember yöntemi, DynamicObject sınıf.TryGetMember Dinamik bir sınıf üyesi istenen ve hiçbir bağımsız değişken belirtilmiş yöntemi çağrılır.binder Bağımsız değişken başvurulan üye hakkında bilgi içerir ve result bağımsız değişkeni belirtilen üye için döndürülen sonuç başvurur.TryGetMember Yöntemi döndüren bir Boolean değeri döndürür true istenen üye varsa; Aksi halde döner 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
    
    // 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;
    }
    
  11. Sonra TryGetMember yöntemini geçersiz kılmak için aşağıdaki kodu ekleyip TryInvokeMember yöntemi, DynamicObject sınıf.TryInvokeMember Dinamik bir sınıf üyesi değişkenleri ile istendiğinde yöntemi çağrılır.binder Bağımsız değişken başvurulan üye hakkında bilgi içerir ve result bağımsız değişkeni belirtilen üye için döndürülen sonuç başvurur.args Bağımsız değişkeni bir dizi üyesi için geçirilen bağımsız değişkenler içerir.TryInvokeMember Yöntemi döndüren bir Boolean değeri döndürür true istenen üye varsa; Aksi halde döner false.

    Özel sürümü TryInvokeMember yönteminin beklediği arasında bir değer olacak şekilde ilk bağımsız değişken StringSearchOption bir önceki adımda tanımlanan numaralandırma.TryInvokeMember Yönteminin beklediği ikinci bağımsız değişken bir Boole değeri.Bir veya iki bağımsız değişken geçerli değerler, bunlar için geçirilen GetPropertyValue sonuçları almak için yöntem.

    ' 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
    
    // 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;
    }
    
  12. Dosyayı kaydedip kapatın.

Örnek bir metin dosyası oluşturmak için

  1. DynamicSample projesini sağ tıklatın ve işaret Ekle[NULL]'ı Yeni madde.İçinde Yüklü Şablonlar bölmesinde, select Genelve sonra seçin Metin dosyası şablonu.TextFile1.txt varsayılan adı bırakın adı kutusunu ve ardından Ekle.Yeni bir metin dosyası projenize eklenir.

  2. TextFile1.txt dosyasına aşağıdaki metni kopyalayın.

    List of customers and suppliers
    
    Supplier: Lucerne Publishing (http://www.lucernepublishing.com/)
    Customer: Preston, Chris
    Customer: Hines, Patrick
    Customer: Cameron, Maria
    Supplier: Graphic Design Institute (http://www.graphicdesigninstitute.com/) 
    Supplier: Fabrikam, Inc. (http://www.fabrikam.com/) 
    Customer: Seubert, Roxanne
    Supplier: Proseware, Inc. (https://www.proseware.com/) 
    Customer: Adolphi, Stephan
    Customer: Koch, Paul
    
  3. Dosyayı kaydedip kapatın.

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

  1. İçinde Çözüm Gezgini, kullanıyorsanız, Module1.vb dosyasını çift Visual Basic veya Program.cs dosyasını Visual C# kullanıyorsanız.

  2. Aşağıdaki kod örneği oluşturmak için ana yordama ekleyin ReadOnlyFile TextFile1.txt dosyası için sınıf.Geç bağlama dinamik üyeleri arayın ve "Müşteri" dizesini içeren metin satırları almak için 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
    
    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);
    }
    
  3. Dosyayı kaydedin ve yapı ve uygulama çalıştırmak için ctrl + F5 tuşlarına basın.

Dinamik Dil kitaplığı çağırma

Bu anlatımda oluşturduğunuz sonraki proje IronPython dinamik dilinde yazılmış bir kitaplık erişir.Bu projeyi oluşturmadan önce IronPython 2.6.1 .NET 4.0 yüklü olmalıdır.Gelen 2.6.1 IronPython .NET 4.0 karşıdan yükleyebileceğiniz CodePlex.

Özel dinamik bir sınıf oluşturmak için

  1. İçinde Visual Studio, Dosya menüsü, Yeni ve ardından Proje.

  2. İçinde Yeni bir proje iletişim kutusunda Proje türleri bölmesi, emin olun Windows seçilir.Seçin Konsol uygulaması , şablonları bölmesi.İçinde adı yazın DynamicIronPythonSample[NULL]'ı Tamam.Yeni Proje oluşturulur.

  3. Kullanıyorsanız, Visual Basic, DynamicIronPythonSample projesini sağ tıklatın ve sonra özelliklerini.Tıklatın başvuruları sekme.Tıklatın Ekle düğmesi.Visual C# içinde kullanıyorsanız, Çözüm Gezgini, sağ başvuruları klasörü tıklatın ve sonra Add Reference.

  4. Üzerinde göz sekmesinde, IronPython kitaplıklarına yüklendiği klasöre göz atın.C:\Program Files\IronPython 2.6 .NET 4.0 için örneğin, bilgi.Seçin IronPython.dll, IronPython.Modules.dll, Microsoft.Scripting.dll, ve Microsoft.Dynamic.dll kitaplıkları.Tamam düğmesini tıklatın.

  5. Kullanıyorsanız, Visual Basic, Module1.vb dosyasını düzenleyin.Visual C# kullanıyorsanız Program.cs dosyasını düzenleyin.

  6. Dosya üstünde almak için aşağıdaki kodu ekleyin Microsoft.Scripting.Hosting ve IronPython.Hosting isim uzaylarına IronPython kitaplıklarına.

    Imports Microsoft.Scripting.Hosting
    Imports IronPython.Hosting
    
    using Microsoft.Scripting.Hosting;
    using IronPython.Hosting;
    
  7. Yeni bir oluşturmak için aşağıdaki kodu Main yöntemine ekleyin Microsoft.Scripting.Hosting.ScriptRuntime IronPython kitaplıklarına barındırmak için nesne.ScriptRuntime Nesnesi, IronPython kitaplığı modülü random.py yükler.

    ' Set the current directory to the IronPython libraries.
    My.Computer.FileSystem.CurrentDirectory = 
       My.Computer.FileSystem.SpecialDirectories.ProgramFiles &
       "\IronPython 2.6 for .NET 4.0\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.")
    
    // Set the current directory to the IronPython libraries.
    System.IO.Directory.SetCurrentDirectory(
       Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + 
       @"\IronPython 2.6 for .NET 4.0\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.");
    
  8. Random.py modülü koddan sonra dizisi oluşturmak için aşağıdaki kodu ekleyin.Dizi için geçirilen shuffle yöntemi dizideki değerlerden rasgele sıralar random.py Modülü.

    ' 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
    
    // 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("-------------------");
    }
    
  9. Dosyayı kaydedin ve yapı ve uygulama çalıştırmak için ctrl + F5 tuşlarına basın.

Ayrıca bkz.

Başvuru

System.Dynamic

System.Dynamic.DynamicObject

Dinamik (C# Reference)

Kavramlar

(Visual Basic) erken ve geç bağlama

Diğer Kaynaklar

Tür dinamik (C# Programlama Kılavuzu) kullanma

Dinamik (Dış blog) arabirimleri uygulayan