Welcome to MSDN Blogs Sign in | Join | Help
DLRにおけるオブジェクト・メンバーリストの取得方法

Silverlight 2.0 Beta1 SDKに含まれているDLRは、IronPython 2.0A8相当です。IronPython 2.0 Beta1に含まれるDLR相当を使いたい場合は、Dynamicsilverlight.netのFlickrサンプルから試してください。今回は、DLRを使ったオブジェクトのメンバーを言語非依存で参照する方法をご紹介します。例えば、以下のPythonコマンドを見てください。

>>> import datetime
>>> dir(datetime)
['MAXYEAR', 'MINYEAR', '__builtins__', '__name__', 'date',
 'datetime', 'time', 'timedelta', 'tzinfo']
pythonのdir関数でdatetimeモジュールに含まれるメンバーを表示しています。これと同じことを行うのが、以下のコードです。
ScriptDomainManager sdm;
IScriptEngine engine;
IScriptScope scope;
string import = "import datetime"
sdm = ScriptDomainManager.CurrentManager;
engine = sdm.GetEngine("py");
// import datetimeを実行する
SourceUnit su = engine.CreateScriptSourceFromString(
               import, SourceCodeKind.Statements);
scope = engine.CreateScope();
engine.Execute(scope, su);
// datetimeモジュールを取得する
object datetime_object;
bool bret = eng.TryGetVariable(scope, 
               "datetime", out datetime_object);
// datetimeモジュールのメンバーを取得する
IList<string> mls = engine.Operations.
                 GetMemberNames(datetime_object);

これでmlsにメンバーリストが返ってきます。このコードのポイントは、TryGetVariableメソッドでオブジェクトを取得してから、Operations.GetMemberNamaesメソッドでメンバーリストを取得することです。注意しないといけないのは、GetMemberNamaesメソッドが例外を出力する可能性があることです。
では、次のpythonコードを見てください。
>>> dir(datetime.date)
['CheckType', 'CompareTo', 'Equals', 'GetHashCode', 'InternalDateTime', 'ToStrin
g', '__add__', '__class__', '__delattr__', '__doc__', 
'__eq__', '__ge__', '__getattribute__', '__getnewargs__', 
長いので省略しています
 'strftime', 'timetuple', 'today', 'toordinal', 'weekday', 'year']
datetimeモジュールのdateクラスのメンバーをdir関数で取得しています。これと同じことをDLRで行うのが、以下のコードになります。
// dateクラスの型を取得する
object p_date;
ret = engine.Operations.TryGetMember(
             datetime_object, "date", out p_date);
// dateクラスのメンバを取得する
var wk = engine.Operations.DoOperation(
                       Operators.MemberNames, p_date);
IList<string> dmls = SymbolTable.IdsToStrings(
                       (IList<SymbolId>) wk);


これでdmlsにdateクラスのメンバーリストが返ってきます。このコードのポイントは、Operations.TryGetMemberメソッドでdatetimeモジュールのdateクラスの型を取得することと、Operations.DoOperationメソッドでしょう。DoOperationメソッドを使うことで、変数として管理されていないクラス(型)のメンバーを取得しています。この結果は、SymbolIdのListコレクションとして返ってきますので、SymbolTable.IdsToStringメソッドで、文字列のListに変換しています。

このようにすることで言語非依存でオブジェクトのメンバーを取得することができるようになります。これらの機能を組み合わせたのが、DLR Consoleのインテリセンスなのです。
IDE支援というか開発支援のインフラとしてのコード補完機能として、このような機能がDLRには用意されています。

Posted: Saturday, March 15, 2008 6:50 PM by shozoa
Filed under: , ,

Comments

No Comments

Leave a Comment

(required) 

(required) 

(optional)

(required) 

  
Enter Code Here: Required

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Page view tracker