如何从IronRuby中创建可枚举的动态.Net对象?

时间:2014-06-29 18:35:09

标签: c# .net foreach ironruby

我有一个在C#中实现多个对象的应用程序,然后通过将这些对象添加到Microsoft.Scripting.Hosting.ScriptScope来预期这些对象可以从IronRuby中使用。这在很大程度上起作用:我已经学会了如何实现DynamicObject的各个成员以使事情正确。但是如何让一个对象与Ruby的for循环兼容?

我的C#对象如下所示:

 public class TrialObject : DynamicObject, IEnumerable<int> {
    public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) {
       if (indexes.Length != 1) return base.TryGetIndex(binder, indexes, out result);
       try {
          var index = (int)indexes[0];
          result = index;
          return true;
       } catch { return base.TryGetIndex(binder, indexes, out result); }
    }

    public int Length { get { return 3; } }

    public IEnumerator<int> GetEnumerator() {
       yield return 0;
       yield return 1;
       yield return 2;
    }

    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
 }

然后我尝试使用ruby中的对象,就像这样。

trial.Length                   # returns 3
trial[0]                       # returns 0
trial[2]                       # returns 2
for t in trial do <stuff>; end #error: no block given

如何调整试用对象以使其在for循环中工作?我知道我可以在0..trial.Length-1&#34;中使用&#34; i作为一个黑客,但我宁愿解决问题,而不是引入黑客。

1 个答案:

答案 0 :(得分:0)

经过一些反复试验,我了解到我可以通过在课堂上添加“每个”方法来获得理想的效果。

public class TrialObject : DynamicObject, IEnumerable<int> {
   ...
   public IEnumerable<BuildableObject> each() { return this; }
   ...
}

似乎ironruby使用“each”方法来实现它。因此,通过添加每个方法,我可以让这个动态对象像它试图成为的IEnumerable一样。