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