在IronRuby中检索访问器

时间:2010-04-14 20:28:18

标签: ironruby

我正在试图弄清楚如何检索存储在Person类中的值。问题在于,在定义Person类的实例后,我不知道如何在IronRuby代码中检索它,因为实例名称在.NET部分中。

 /*class Person
        attr_accessor :name

                def initialize(strname)
                    self.name=strname
                end
    end*/

    //We start the DLR, in this case starting the Ruby version


 ScriptEngine engine = IronRuby.Ruby.CreateEngine();
        ScriptScope scope = engine.ExecuteFile("c:\\Users\\ron\\RubymineProjects\\untitled\\person.rb");

    //We get the class type
    object person = engine.Runtime.Globals.GetVariable("Person");

    //We create an instance
    object marcy = engine.Operations.CreateInstance(person, "marcy");

1 个答案:

答案 0 :(得分:2)

[编辑:刚刚安装了VS和IronRuby并测试了所有内容。]

我能想到的最简单方法是将marcy键入dynamic而不是object,然后调用访问者(如果我没记错的话,实际上会将其表示为属性在.NET方面):

dynamic marcy = engine.Operations.CreateInstance(person, "marcy");
var name = marcy.name;

如果您不使用.NET 4,则必须通过“丑陋”的基于字符串的API:

var name = engine.Operations.InvokeMember(marcy, "name");

顺便说一句:如果您 使用.NET 4,您还可以简化其他一些代码。例如,Globals实现IDynamicObject并提供模拟Ruby TryGetProperty的{​​{1}}实现,所以总而言之,你可以这样做:

method_missing

请注意,您可以“点到”var engine = IronRuby.Ruby.CreateEngine(); engine.ExecuteFile("person.rb"); dynamic globals = engine.Runtime.Globals; dynamic person = globals.Person; dynamic marcy = person.@new("marcy"); // why does new have to be a reserved word? var name = marcy.name; 来获取Globals全局常量,而不必将其作为字符串传递,您只需调用Person方法即可在new类上(尽管你不得不逃避它,因为Person是一个保留字,尽管解析器知道差异对于创建实例是微不足道的。)