0

Person クラスに格納されている値を取得する方法を見つけようとしています。問題は、Person クラスのインスタンスを定義した後、インスタンス名が .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");
4

1 に答える 1

2

[編集: VS と IronRuby をインストールし、すべてをテストしました。]

私が考えることができる最も簡単な方法は、代わりにmarcyasを入力し、アクセサーを呼び出すことです (正しく覚えていれば、.NET 側のプロパティとして実際に表されます)。dynamicobject

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

.NET 4 を使用していない場合は、「醜い」文字列ベースの API を使用する必要があります。

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

ところで: .NET 4 を使用する場合は、他のコードの一部を簡素化することもできますたとえば、Ruby の をエミュレートする の実装をGlobals実装IDynamicObjectして提供するため、全体として次のようにすることができます。TryGetPropertymethod_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を取得でき、クラスのメソッドを呼び出すことができることに注意してください (残念ながら は予約語であるためエスケープする必要がありますが、パーサーが違いを認識してインスタンスを作成するのは簡単です。PersonnewPersonnew

于 2010-04-14T21:34:07.823 に答える