2010-11-15 3 views
5

Можно ли вызвать метод IronRuby из C# с делегатом в качестве параметра таким образом, чтобы работала yield?Вызов IronRuby из C# с делегатом

следующее дает мне неправильное количество аргументов (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); 

ответ

1

Я уверен, что блок Ruby не является делегатом C#.
Если вы передадите делегат в 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 = [email protected](); 
t.test(new Action<string>(Console.WriteLine)); 

Может ли мы преобразовать C# делегат в рубиновый блок ... Я не знаю.

+0

+1 для показа, как вызвать делегатов C# из IronRuby. Все еще любопытно, есть ли способ получить код C# от IronRuby. –

Смежные вопросы