-1

test.pyに保存されているPythonコードがあります

def Process():
   list1 = [1, 2, 3]                       #list object                    
   return list1

C#コードもあります

        List<int> list1 = new List<int>(new int[3]);
        var runtime = Python.CreateRuntime();
        dynamic test = runtime.UseFile(m_sFilename);
        var list2 = test.Process();
        list1 = (List<int>)list2;           << Error
        /*
        list1[0] = list2[0];  // this code works fine but need how to
        list1[1] = list2[1];
        list1[2] = list2[2];
        */

これを実行すると、RuntimeBinderExceptionが処理されませんでした

タイプ「IronPython.Runtime.List」を「System.Collections.Generic.List」に変換できません

これを修正する方法は?

また、リストをPythonに渡す方法は?

4

1 に答える 1

1

これに取り組むには2つの方法があります。

  1. Pythonの「バニラ」を維持します(.net / IronPython固有のコードがない場合が必要な場合があります)。

これにより、次のPythonスクリプトが得られます。

def Process(list):
    list1 = [1, 2, 3] #list object
    return list1 + list # concatenate lists

およびC#コード(.netでさらに処理するためにLINQにキャストしてから使用する方法に注意してくださいIList<object>。データ/ユースケースの量によっては、IronPythonランタイムによって返されるIListを使用し続ける場合もあります。):

var m_sFilename = "test.py";
var list = new IronPython.Runtime.List();
list.append(4);
list.append(5);
list.append(6);

var runtime = Python.CreateRuntime();
dynamic test = runtime.UseFile(m_sFilename);
var resultList = test.Process(list);

var dotNetList = ((IList<object>)resultList).Cast<int>().ToList();
  1. インターフェイス/Pythonコードで.netタイプを使用します。

これにより、Pythonコードが次のように変更されます。

import clr
clr.AddReference("System.Core")
import System
clr.ImportExtensions(System.Linq)
from System.Collections.Generic import List

def ProcessDotNetStyle(list):
    list1 = List[int]([1, 2, 3])
    return list1.Union(list).ToList()

C#は次のようになります

var dotNetList = new List<int>(new[] { 4, 5, 6 });
dotNetList = test.ProcessDotNetStyle(dotNetList);
于 2012-05-19T16:11:45.580 に答える