我有一个在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作为一个黑客,但我宁愿解决问题,而不是引入黑客。
答案 0 :(得分:0)
经过一些反复试验,我了解到我可以通过在课堂上添加“每个”方法来获得理想的效果。
public class TrialObject : DynamicObject, IEnumerable<int> {
...
public IEnumerable<BuildableObject> each() { return this; }
...
}
似乎ironruby使用“each”方法来实现它。因此,通过添加每个方法,我可以让这个动态对象像它试图成为的IEnumerable一样。