チュートリアル: 動的オブジェクトの作成と使用 (C# および Visual Basic)Walkthrough: Creating and Using Dynamic Objects (C# and Visual Basic)

動的オブジェクトは、プロパティやメソッドなどのメンバーを、コンパイル時ではなく実行時に公開します。Dynamic objects expose members such as properties and methods at run time, instead of at compile time. これにより、静的な型や書式に一致しない構造体と連携するオブジェクトを作成することができます。This enables you to create objects to work with structures that do not match a static type or format. たとえば、動的オブジェクトを使用して HTML ドキュメント オブジェクト モデル (DOM) を参照することもできます。HTML DOM には、有効な HTML マークアップ要素と属性の任意の組み合わせを含めることができます。For example, you can use a dynamic object to reference the HTML Document Object Model (DOM), which can contain any combination of valid HTML markup elements and attributes. 各 HTML ドキュメントは一意であるため、特定の HTML ドキュメントのメンバーは実行時に決定されます。Because each HTML document is unique, the members for a particular HTML document are determined at run time. HTML 要素の属性を参照するための一般的な方法は、属性の名前を要素の GetProperty メソッドに渡す方法です。A common method to reference an attribute of an HTML element is to pass the name of the attribute to the GetProperty method of the element. HTML 要素 <div id="Div1">id 属性を参照するには、まず <div> 要素への参照を取得し、その後 divElement.GetProperty("id") を使用します。To reference the id attribute of the HTML element <div id="Div1">, you first obtain a reference to the <div> element, and then use divElement.GetProperty("id"). 動的オブジェクトを使用する場合は、id 属性を divElement.id として参照できます。If you use a dynamic object, you can reference the id attribute as divElement.id.

動的オブジェクトを使用すると、IronPython や IronRuby などの動的言語にも簡単にアクセスできます。Dynamic objects also provide convenient access to dynamic languages such as IronPython and IronRuby. 動的オブジェクトを使用して、実行時に解釈される動的スクリプトを参照することもできます。You can use a dynamic object to refer to a dynamic script that is interpreted at run time.

動的オブジェクトを参照するには、遅延バインディングを使用します。You reference a dynamic object by using late binding. C# では、遅延バインディング オブジェクトの型は dynamic として指定します。In C#, you specify the type of a late-bound object as dynamic. Visual Basic では、遅延バインディング オブジェクトの型は Object として指定します。In Visual Basic, you specify the type of a late-bound object as Object. 詳しくは、「dynamic」および「事前バインディングと遅延バインディング」をご覧ください。For more information, see dynamic and Early and Late Binding.

カスタムの動的オブジェクトは、System.Dynamic 名前空間内のクラスを使用して作成できます。You can create custom dynamic objects by using the classes in the System.Dynamic namespace. たとえば、ExpandoObject を作成し、実行時にそのオブジェクトのメンバーを指定することもできます。For example, you can create an ExpandoObject and specify the members of that object at run time. また、DynamicObject クラスを継承する、独自の型を作成することもできます。You can also create your own type that inherits the DynamicObject class. その後、DynamicObject クラスのメンバーをオーバーライドして、実行時の動的機能を提供することができます。You can then override the members of the DynamicObject class to provide run-time dynamic functionality.

このチュートリアルでは、次のタスクを行います。In this walkthrough you will perform the following tasks:

  • テキスト ファイルの内容をオブジェクトのプロパティとして動的に公開する、カスタム オブジェクトを作成する。Create a custom object that dynamically exposes the contents of a text file as properties of an object.

  • IronPython ライブラリを使用するプロジェクトを作成する。Create a project that uses an IronPython library.

必須コンポーネントPrerequisites

このチュートリアルを実行するには、IronPython for .NET が必要です。You need IronPython for .NET to complete this walkthrough. 最新バージョンを取得するには、ダウンロード ページに移動します。Go to their Download page to obtain the latest version.

注意

次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。The Visual Studio edition that you have and the settings that you use determine these elements. 詳細については、「IDE をカスタマイズする」をご覧ください。For more information, see Personalizing the IDE.

カスタム動的オブジェクトの作成Creating a Custom Dynamic Object

このチュートリアルで作成する最初のプロジェクトでは、テキスト ファイルの内容を検索するカスタムの動的オブジェクトを定義します。The first project that you create in this walkthrough defines a custom dynamic object that searches the contents of a text file. 検索するテキストは、動的プロパティの名前によって指定されます。Text to search for is specified by the name of a dynamic property. たとえば、呼び出しコードで dynamicFile.Sample が指定された場合、動的クラスは "Sample" で始まるすべての行をファイルから取得し、それらを含んだ文字列のジェネリック リストを返します。For example, if calling code specifies dynamicFile.Sample, the dynamic class returns a generic list of strings that contains all of the lines from the file that begin with "Sample". 検索では、大文字と小文字を区別しません。The search is case-insensitive. 動的クラスでは、2 つの省略可能な引数もサポートされています。The dynamic class also supports two optional arguments. 最初の引数は、検索オプションの列挙値です。この引数では、動的クラスが行の先頭、行の末尾、または行内の任意の場所から一致を検索することを指定します。The first argument is a search option enum value that specifies that the dynamic class should search for matches at the start of the line, the end of the line, or anywhere in the line. 2 番目の引数は、動的クラスが検索の前に各行から先頭と末尾の空白をトリミングすることを指定します。The second argument specifies that the dynamic class should trim leading and trailing spaces from each line before searching. たとえば、呼び出しコードで dynamicFile.Sample(StringSearchOption.Contains) と指定された場合、動的クラスは行内の任意の場所にある "Sample" を検索します。For example, if calling code specifies dynamicFile.Sample(StringSearchOption.Contains), the dynamic class searches for "Sample" anywhere in a line. 呼び出しコードで dynamicFile.Sample(StringSearchOption.StartsWith, false) と指定された場合、動的クラスは、各行の先頭にある "Sample" を検索し、先頭と末尾のスペースは削除しません。If calling code specifies dynamicFile.Sample(StringSearchOption.StartsWith, false), the dynamic class searches for "Sample" at the start of each line, and does not remove leading and trailing spaces. 既定では、動的クラスは各行の先頭で一致を検索し、先頭と末尾のスペースを削除します。The default behavior of the dynamic class is to search for a match at the start of each line and to remove leading and trailing spaces.

カスタムの動的クラスを作成するにはTo create a custom dynamic class

  1. Visual Studio を起動します。Start Visual Studio.

  2. [ファイル] メニューの [新規作成] をポイントし、 [プロジェクト] をクリックします。On the File menu, point to New and then click Project.

  3. [新しいプロジェクト] ダイアログ ボックスの [プロジェクトの種類] ペインで、[Windows] が選択されていることを確認します。In the New Project dialog box, in the Project Types pane, make sure that Windows is selected. [テンプレート] ペインの [コンソール アプリケーション] を選択します。Select Console Application in the Templates pane. [名前] ボックスに DynamicSample と入力して、[OK] をクリックします。In the Name box, type DynamicSample, and then click OK. 新しいプロジェクトが作成されます。The new project is created.

  4. DynamicSample プロジェクトを右クリックし、[追加] をポイントした後、[クラス] をクリックします。Right-click the DynamicSample project and point to Add, and then click Class. [名前] ボックスに ReadOnlyFile と入力して、[OK] をクリックします。In the Name box, type ReadOnlyFile, and then click OK. ReadOnlyFile クラスを含んだ新しいファイルが追加されます。A new file is added that contains the ReadOnlyFile class.

  5. ReadOnlyFile.cs ファイルまたは ReadOnlyFile.vb ファイルの先頭に、次のコードを追加して System.IO および System.Dynamic 名前空間をインポートします。At the top of the ReadOnlyFile.cs or ReadOnlyFile.vb file, add the following code to import the System.IO and System.Dynamic namespaces.

    using System.IO;
    using System.Dynamic;
    
    Imports System.IO
    Imports System.Dynamic
    
  6. カスタム動的オブジェクトでは、列挙型を使用して検索条件を決定します。The custom dynamic object uses an enum to determine the search criteria. クラス ステートメントの前に、次の列挙定義を追加します。Before the class statement, add the following enum definition.

    public enum StringSearchOption
    {
        StartsWith,
        Contains,
        EndsWith
    }
    
    Public Enum StringSearchOption
        StartsWith
        Contains
        EndsWith
    End Enum
    
  7. 次のコード例に示すように、クラス ステートメントを更新して DynamicObject クラスを継承します。Update the class statement to inherit the DynamicObject class, as shown in the following code example.

    class ReadOnlyFile : DynamicObject
    
    Public Class ReadOnlyFile
        Inherits DynamicObject
    
  8. ReadOnlyFile クラスに次のコードを追加して、 ファイル パスのプライベート フィールドと、ReadOnlyFile クラスのコンス トラクターを定義します。Add the following code to the ReadOnlyFile class to define a private field for the file path and a constructor for the ReadOnlyFile class.

    // 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;
    }
    
    ' 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
    
  9. 次の GetPropertyValue メソッドを ReadOnlyFile クラスに追加します。Add the following GetPropertyValue method to the ReadOnlyFile class. GetPropertyValue メソッドは検索条件を (入力として) 受け取り、テキスト ファイルから検索条件に一致する行を返します。The GetPropertyValue method takes, as input, search criteria and returns the lines from a text file that match that search criteria. ReadOnlyFile クラスによって提供される動的メソッドは、GetPropertyValue メソッドを呼び出して、それぞれの結果を取得します。The dynamic methods provided by the ReadOnlyFile class call the GetPropertyValue method to retrieve their respective results.

    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;
    }
    
    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
    
  10. GetPropertyValue メソッドの後に、DynamicObject クラスの TryGetMember メソッドをオーバーライドする次のコードを追加します。After the GetPropertyValue method, add the following code to override the TryGetMember method of the DynamicObject class. TryGetMember メソッドは、動的クラスのメンバーが要求され、引数が指定されていない場合に呼び出されます。The TryGetMember method is called when a member of a dynamic class is requested and no arguments are specified. binder 引数には、参照されているメンバーに関する情報が含まれます。result 引数は、指定したメンバーに対して返された結果を参照します。The binder argument contains information about the referenced member, and the result argument references the result returned for the specified member. TryGetMember メソッドはブール値を返します。要求されたメンバーが存在する場合には true を返し、その他の場合には false を返します。The TryGetMember method returns a Boolean value that returns true if the requested member exists; otherwise it returns 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;
    }
    
    ' 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
    
  11. TryGetMember メソッドの後に、DynamicObject クラスの TryInvokeMember メソッドをオーバーライドする次のコードを追加します。After the TryGetMember method, add the following code to override the TryInvokeMember method of the DynamicObject class. TryInvokeMember メソッドは、動的クラスのメンバーが引数を使用して要求された場合に呼び出されます。The TryInvokeMember method is called when a member of a dynamic class is requested with arguments. binder 引数には、参照されているメンバーに関する情報が含まれます。result 引数は、指定したメンバーに対して返された結果を参照します。The binder argument contains information about the referenced member, and the result argument references the result returned for the specified member. args 引数には、メンバーに渡される引数の配列が含まれます。The args argument contains an array of the arguments that are passed to the member. TryInvokeMember メソッドはブール値を返します。要求されたメンバーが存在する場合には true を返し、その他の場合には false を返します。The TryInvokeMember method returns a Boolean value that returns true if the requested member exists; otherwise it returns false.

    TryInvokeMember メソッドのカスタム バージョンは、1 つ目の引数として、前の手順で定義した StringSearchOption 列挙からの値を受け付けます。The custom version of the TryInvokeMember method expects the first argument to be a value from the StringSearchOption enum that you defined in a previous step. TryInvokeMember メソッドは、2 つ目の引数としてブール値を受け付けます。The TryInvokeMember method expects the second argument to be a Boolean value. 引数の一方または両方が有効な値であれば、それらが GetPropertyValue メソッドに渡され、結果が取得されます。If one or both arguments are valid values, they are passed to the GetPropertyValue method to retrieve the results.

    // 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;
    }
    
    ' 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
    
  12. ファイルを保存して閉じます。Save and close the file.

サンプルのテキスト ファイルを作成するにはTo create a sample text file

  1. DynamicSample プロジェクトを右クリックし、[追加] をポイントした後、[新しい項目] をクリックします。Right-click the DynamicSample project and point to Add, and then click New Item. [インストールされたテンプレート] ペインで [全般] をクリックし、[テキスト ファイル] テンプレートを選択します。In the Installed Templates pane, select General, and then select the Text File template. [名前] ボックスで、既定の名前である TextFile1.txt をそのままにし、[追加] をクリックします。Leave the default name of TextFile1.txt in the Name box, and then click Add. 新しいテキスト ファイルがプロジェクトに追加されます。A new text file is added to the project.

  2. TextFile1.txt ファイルに次のテキストをコピーします。Copy the following text to the TextFile1.txt file.

    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. ファイルを保存して閉じます。Save and close the file.

カスタム動的オブジェクトを使用するサンプル アプリケーションを作成するにはTo create a sample application that uses the custom dynamic object

  1. ソリューション エクスプローラーで、Visual Basic を使用している場合は Module1.vb ファイルを、Visual C# を使用している場合は Program.cs ファイルをダブルクリックします。In Solution Explorer, double-click the Module1.vb file if you are using Visual Basic or the Program.cs file if you are using Visual C#.

  2. Main プロシージャに次のコードを追加して、TextFile1.txt ファイルの ReadOnlyFile クラスのインスタンスを作成します。Add the following code to the Main procedure to create an instance of the ReadOnlyFile class for the TextFile1.txt file. このコードは、遅延バインディングを使用して動的メンバーを呼び出し、"Customer" という文字列を含んだテキスト行を取得します。The code uses late binding to call dynamic members and retrieve lines of text that contain the string "Customer".

    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);
    }
    
    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. ファイルを保存し、Ctrl キーを押しながら F5 キーを押してアプリケーションをビルドし、実行します。Save the file and press CTRL+F5 to build and run the application.

動的言語ライブラリの呼び出しCalling a Dynamic Language Library

このチュートリアルで作成する次のプロジェクトでは、動的言語 IronPython で記述されたライブラリにアクセスします。The next project that you create in this walkthrough accesses a library that is written in the dynamic language IronPython.

カスタムの動的クラスを作成するにはTo create a custom dynamic class

  1. Visual Studio で、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。In Visual Studio, on the File menu, point to New and then click Project.

  2. [新しいプロジェクト] ダイアログ ボックスの [プロジェクトの種類] ペインで、[Windows] が選択されていることを確認します。In the New Project dialog box, in the Project Types pane, make sure that Windows is selected. [テンプレート] ペインの [コンソール アプリケーション] を選択します。Select Console Application in the Templates pane. [名前] ボックスに DynamicIronPythonSample と入力して、[OK] をクリックします。In the Name box, type DynamicIronPythonSample, and then click OK. 新しいプロジェクトが作成されます。The new project is created.

  3. Visual Basic を使用している場合は、DynamicIronPythonSample プロジェクトを右クリックし、[プロパティ] をクリックします。If you are using Visual Basic, right-click the DynamicIronPythonSample project and then click Properties. [参照] タブをクリックします。[追加] ボタンをクリックします。Click the References tab. Click the Add button. Visual C# を使用している場合は、ソリューション エクスプローラー[参照] フォルダーを右クリックし、[参照の追加] をクリックします。If you are using Visual C#, in Solution Explorer, right-click the References folder and then click Add Reference.

  4. [参照] タブで、IronPython ライブラリがインストールされているフォルダーを参照します。On the Browse tab, browse to the folder where the IronPython libraries are installed. たとえば、 C:\Program Files\IronPython 2.6 for .NET 4.0 です。For example, C:\Program Files\IronPython 2.6 for .NET 4.0. IronPython.dllIronPython.Modules.dllMicrosoft.Scripting.dll、および Microsoft.Dynamic.dll ライブラリを選択します。Select the IronPython.dll, IronPython.Modules.dll, Microsoft.Scripting.dll, and Microsoft.Dynamic.dll libraries. [OK] をクリックします。Click OK.

  5. Visual Basic を使用している場合は、Module1.vb ファイルを編集します。If you are using Visual Basic, edit the Module1.vb file. Visual C# を使用している場合は、Program.cs ファイルを編集します。If you are using Visual C#, edit the Program.cs file.

  6. ファイルの先頭に、IronPython ライブラリから Microsoft.Scripting.Hosting および IronPython.Hosting 名前空間をインポートするための次のコードを追加します。At the top of the file, add the following code to import the Microsoft.Scripting.Hosting and IronPython.Hosting namespaces from the IronPython libraries.

    using Microsoft.Scripting.Hosting;
    using IronPython.Hosting;
    
    Imports Microsoft.Scripting.Hosting
    Imports IronPython.Hosting
    
  7. Main メソッドで、IronPython ライブラリをホストする新しい Microsoft.Scripting.Hosting.ScriptRuntime オブジェクトを作成するための次のコードを追加します。In the Main method, add the following code to create a new Microsoft.Scripting.Hosting.ScriptRuntime object to host the IronPython libraries. ScriptRuntime オブジェクトは、IronPython ライブラリ モジュール random.py を読み込みます。The ScriptRuntime object loads the IronPython library module random.py.

    // 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.");
    
    ' 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.")
    
  8. Random.py モジュールを読み込むコードの後に、整数の配列を作成する次のコードを追加します。After the code to load the random.py module, add the following code to create an array of integers. 配列は random.py モジュールの shuffle メソッドに渡されます。このメソッドは、配列内の値をランダムに並べ替えします。The array is passed to the shuffle method of the random.py module, which randomly sorts the values in the 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("-------------------");
    }
    
    ' 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
    
  9. ファイルを保存し、Ctrl キーを押しながら F5 キーを押してアプリケーションをビルドし、実行します。Save the file and press CTRL+F5 to build and run the application.

関連項目See also