我正在试图弄清楚如何检索存储在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");
答案 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
是一个保留字,尽管解析器知道差异对于创建实例是微不足道的。)