-1

我有 python 代码,它保存到 test.py

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

有两种方法可以解决这个问题:

  1. 保留 python “vanilla”(没有 .net/IronPython 特定代码,可能是必需的):

这为您提供了以下 python 脚本:

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

和 C# 代码(请注意如何转换为IList<object>然后仅使用 LINQ 在 .net 中进行进一步处理。根据数据/用例的数量,您也可以继续使用 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 回答