我有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?
答案 0 :(得分:1)
有两种方法可以解决这个问题:
这将为您提供以下python脚本:
def Process(list):
list1 = [1, 2, 3] #list object
return list1 + list # concatenate lists
和C#代码(注意如何转换为IList<object>
然后只使用LINQ在.net中进行进一步处理。根据数据/用例的数量,您可能还会继续使用返回的IList IronPython运行时。):
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();
这会将你的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);