2010-06-16 7 views
0

Après l'exécution de ce code:Obtenir toutes les méthodes dans un fichier script

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

Comment puis-je obtenir toutes les méthodes d'une classe rubis dans le code C#?

+1

Votre question n'a pas de sens, pouvez-vous préciser? Dans Ruby, il n'y a pas de méthodes dans les fichiers. Toutes les méthodes sont à l'intérieur de modules ou de classes. À partir de Ruby, vous pouvez simplement appeler par exemple 'Module # instance_methods' pour obtenir toutes les méthodes d'instance d'un module, et bien sûr vous pouvez aussi appeler cette même méthode depuis C#. –

+0

Je suis désolé, je ne savais pas que toutes les méthodes devaient être dans une classe ou un module, j'ai édité ma question, merci. – ryudice

Répondre

2

Je n'ai pas tout compris encore, mais est ici un début:

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(); 
    } 
} 

Pardonnez mon style, je ne connais pas réellement C#.

Ceci est mon 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 

Et voici la sortie:

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

Questions connexes