2014-06-29 28 views
0

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

我的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(); } 
} 

然后我尝试使用红宝石的对象,像这样。

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”作为黑客,但我宁愿修复这个问题,而不是引入黑客。

回答

0

经过一些试验和错误之后,我了解到我可以通过为我的课程添加“each”方法来获得所需的效果。

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

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