2010-04-14 41 views
0

我想弄清楚如何檢索存儲在Person類中的值。問題在於,在定義Person類的實例後,我不知道如何在IronRuby代碼中檢索它,因爲實例名稱位於.NET部分。在IronRuby中檢索訪問器

/*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"); 

回答

2

[編輯:剛裝VS和IronRuby和測試,一切]

我能想到的最簡單的方法是鍵入marcydynamic代替object,並調用訪問(這要是我沒記錯的話實際上是表示在.NET方面的屬性):

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

如果你不使用.NET 4,你必須要經過「難看」基於字符串的API:

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

BTW:如果您使用.NET 4中,您還可以簡化你的一些其他的代碼。例如,Globals實現IDynamicObject,並提供模擬Ruby的method_missing,所以這一切的一切,你可以做這樣的事情的TryGetProperty系統的實現:

var engine = IronRuby.Ruby.CreateEngine(); 
engine.ExecuteFile("person.rb"); 
dynamic globals = engine.Runtime.Globals; 
dynamic person = globals.Person; 
dynamic marcy = [email protected]("marcy"); // why does new have to be a reserved word? 
var name = marcy.name; 

注意如何你可以「點到」 Globals得到Person全球常量,而不必將其作爲字符串傳入,您可以調用Person類中的new方法(儘管因爲new是保留字,您不幸必須轉義它,儘管分析器知道差異)來創建一個實例。