使用委托从C#调用IronRuby

5

是否可以以这样的方式从C#调用带有委托参数的IronRuby方法,使得 yield 起作用?

以下代码会引发“参数个数不正确(应为 0)”异常。

Action<string> action = Console.WriteLine;
var runtime = Ruby.CreateRuntime();
var engine = runtime.GetEngine("rb");
engine.Execute(@"
                 class YieldTest
                   def test
                     yield 'From IronRuby'
                   end
                 end
                ");
object test = engine.Runtime.Globals.GetVariable("YieldTest");
dynamic t = engine.Operations.CreateInstance(test);
t.test(action);
2个回答

1

1

我确定 Ruby 的 block 不是 c# 的 delegate。
如果你将 delegate 传递给 Ruby,你应该通过 delegate 的 Invoke 方法来调用它。
这里是示例代码:

var rt = Ruby.CreateRuntime();
var eng = rt.GetEngine("rb");
eng.Execute(@"
            class Blocktest
              def test(block)
                block.Invoke('HELLO From IronRuby')
              end
            end
            ");
dynamic ruby = eng.Runtime.Globals;
dynamic t = ruby.Blocktest.@new();
t.test(new Action<string>(Console.WriteLine));

我们能把C#委托转换成Ruby块吗?我不知道。


展示如何从IronRuby调用C#委托,加1分。仍然好奇是否有一种方法可以从IronRuby“yield” C#代码。 - Jonas Elfström

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接