C# 4.0 IRONPYTHON NET4,嵌入式,传递类对象而不是值

C# 4.0 IRONPYTHON NET4,嵌入式,传递类对象而不是值,c#-4.0,.net-4.0,ironpython,C# 4.0,.net 4.0,Ironpython,我有python代码,它保存在test.py中 def Process(): list1 = [1, 2, 3] #list object return list1 我还有C代码 List list1=新列表(新int[3]); var runtime=Python.CreateRuntime(); 动态测试=runtime.UseFile(m_sFilename); var list2=test.

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

def Process():
   list1 = [1, 2, 3]                       #list object                    
   return list1
我还有C代码

List list1=新列表(新int[3]);
var runtime=Python.CreateRuntime();
动态测试=runtime.UseFile(m_sFilename);
var list2=test.Process();

列表1=(列表)列表2 有两种方法可以实现这一点:

  • 保持python“普通”(不含.net/IronPython特定代码,这可能是一项要求):
  • 这将为您提供以下python脚本:

    def Process(list):
        list1 = [1, 2, 3] #list object
        return list1 + list # concatenate lists
    
    和C#代码(请注意如何强制转换到IList
    ,然后在.net中使用LINQ进行进一步处理。根据数据量/用例,您也可以继续使用IronPython运行时返回的IList):

    你的C#看起来像

    var dotNetList = new List<int>(new[] { 4, 5, 6 });
    dotNetList = test.ProcessDotNetStyle(dotNetList);
    
    var dotNetList=newlist(new[]{4,5,6});
    dotNetList=test.ProcessDotNetStyle(dotNetList);
    
    请参见。。。第一次谷歌点击你的例外。。。看起来正是你的问题,我有谷歌这个,它很难罚款的结果!不过还是要谢谢你。除了这是NET2之外,我还想问一下可能有不同方法的NET4。如何为字典做到这一点?看看IronPython.Runtime.PythonDictionary
    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();
    
    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()
    
    var dotNetList = new List<int>(new[] { 4, 5, 6 });
    dotNetList = test.ProcessDotNetStyle(dotNetList);