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