Получение всех методов внутри файла скрипта - PullRequest
0 голосов
/ 17 июня 2010

После выполнения этого кода:

    var runtime = IronRuby.Ruby.CreateRuntime();
    var engine = IronRuby.Ruby.CreateEngine();
    var scrope = engine.CreateScope();
    engine.ExecuteFile("libtest.rb");

Как я могу получить все методы класса ruby ​​в коде c #?

Ответы [ 2 ]

2 голосов
/ 18 июня 2010

Я еще не все понял, но вот начало:

using System;
using IronRuby;
using Microsoft.Scripting.Hosting;

class IronRubyReflection
{
    static void Main(string[] args)
    {
        var engine = Ruby.CreateEngine();
        var scope = engine.ExecuteFile("libtest.rb");
        dynamic globals = engine.Runtime.Globals;

        var klass = globals.Klass;
        var klass_s = klass.GetOrCreateSingletonClass();
        var modul = globals.Modul;
        var modul_s = modul.GetOrCreateSingletonClass();

        Console.WriteLine(
            scope.GetVariable<IronRuby.Builtins.RubyMethod>(
                "method_in_the_global_object").Name);

        Action<string, IronRuby.Builtins.RubyModule,
            IronRuby.Runtime.Calls.RubyMemberInfo> classprinter =
                (n, k, i) => { Console.WriteLine(n, k, i); };

        klass.ForEachMember(false,
            IronRuby.Runtime.RubyMethodAttributes.Default, classprinter);
        klass_s.ForEachMember(false,
            IronRuby.Runtime.RubyMethodAttributes.Default, classprinter);
        modul.ForEachMember(false,
            IronRuby.Runtime.RubyMethodAttributes.Default, classprinter);
        modul_s.ForEachMember(false,
            IronRuby.Runtime.RubyMethodAttributes.Default, classprinter);

        Console.ReadLine();
    }
}

Прости мой стиль, я на самом деле не знаю C #.

Это мой libtest.rb:

def method_in_the_global_object; end

class Klass
  def instance_method_in_class; end
  def self.class_method; end
end

class Modul
  def instance_method_in_module; end
  def self.module_method; end
end

local = Object.new
def local.singleton_meth; end

@instance = Object.new
def @instance.singleton_meth; end

$global = Object.new
def $global.singleton_meth; end

И это вывод:

method_in_the_global_object
instance_method_in_class
class_method
Equals
ReferenceEquals
allocate
clr_constructor
clr_ctor
clr_new
new
superclass
instance_method_in_module
module_method
Equals
ReferenceEquals
allocate
clr_constructor
clr_ctor
clr_new
new
superclass
1 голос
/ 17 июня 2010

Или вы можете сделать это из C # http://github.com/casualjim/ironrubymvc/blob/master/IronRubyMvc/Core/RubyEngine.cs#L178

Если вы определяете методы, не имея их в классе, их следует добавить в класс Object

...