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

时间:2012-05-18 04:06:25

标签: c#-4.0 .net-4.0 ironpython

我有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?

1 个答案:

答案 0 :(得分:1)

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

  1. 保持python“vanilla”(不含.net / IronPython特定代码,可能是必需的):
  2. 这将为您提供以下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();
    
    1. 在接口/ python代码中使用.net类型:
    2. 这会将你的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);