Получение доступа в IronRuby - PullRequest
0 голосов
/ 15 апреля 2010

Я пытаюсь выяснить, как извлечь значение, хранящееся в классе 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 Ответ

2 голосов
/ 15 апреля 2010

[РЕДАКТИРОВАТЬ: Просто установил 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 и предоставляет реализацию TryGetProperty, которая имитирует Ruby 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 (хотя вам, к сожалению, приходится избегать его, потому что new является зарезервированным словом, хотя парсеру было бы несложно узнать разницу) для создания экземпляра.

...