Вызов IronRuby из C# с делегатом
Можно ли вызвать метод IronRuby из C# с делегатом в качестве параметра таким образом, чтобы yield
должно сработать?
Следующее дает мне неправильное количество аргументов (1 для 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 ответа
Решение
Получил ответ от основного сотрудника IronRuby Томаша Матушека из списка основных пользователей IronRuby, что это невозможно. Еще.
Я уверен, что блок Руби не делегат aC#.
Если вы передаете делегат Ruby, вы должны вызвать его с помощью метода делегата 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 ... Я не знаю.