1

IronPython スクリプトが埋め込まれた C# コードを作成しようとしています。次に、スクリプトの内容を分析します。つまり、すべての変数、関数、クラス、およびそれらのメンバー/メソッドをリストします。

スコープが定義されており、その中でコードが既に実行されていると仮定すると、開始する簡単な方法があります。

dynamic variables=pyScope.GetVariables();
foreach (string v in variables)
{
    dynamic dynamicV=pyScope.GetVariable(); /*seems to return everything. variables,     functions, classes, instances of classes*/
}

しかし、変数の型が何であるかを知るにはどうすればよいでしょうか? 次の Python 'オブジェクト' については、

dynamicV.GetType() 

異なる値を返します:

x=5 --system.Int32

y="asdf" --system.String

def func():... --IronPython.Runtime.PythonFunction

z=class() -- IronPython.Runtime.Types.OldInstance、実際の Python クラスを特定するにはどうすればよいですか?

class NewClass -- エラーをスローします。GetType() は使用できません。

これはほとんど私が探しているものです。利用できないときにスローされた例外をキャプチャして、それがクラス宣言であると想定することはできますが、それはクリーンではないようです。より良いアプローチはありますか?

クラスのメンバー/メソッドを発見するには、次のように使用できます。

ObjectOperations op = pyEngine.Operations;
object instance = op.Call("className");
foreach (string j in op.GetMemberNames("className"))
{
    object member=op.GetMember(instance, j);
    Console.WriteLine(member.GetType());
    /*once again, GetType() provides some info about the type of the member, but returns null sometimes*/
}

また、メソッドにパラメーターを取得するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

1

This isn't something that's really supported, but all of the information is there. You have two options:

  1. Cast the objects to IronPython's classes, like PythonFunction, and use the methods on them. These aren't documented, and all of the necessary methods might not be public, but you can read the source code to figure out how to use them.
  2. Use the normal Python techniques for introspection, like __class__ and __dict__. This is probably the better option.
于 2012-06-26T15:11:51.990 に答える