分析IronPython范围

时间:2012-06-26 02:48:39

标签: ironpython dynamic-language-runtime

我正在尝试使用嵌入式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类是什么?

类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*/
}

另外,如何获取方法的参数?

谢谢!

1 个答案:

答案 0 :(得分:1)

这不是真正支持的东西,但所有信息都在那里。您有两种选择:

  1. 将对象转换为IronPython的类,如PythonFunction,并使用它们上的方法。这些没有记录,并且所有必要的方法可能都不公开,但您可以阅读源代码以了解如何使用它们。
  2. 使用normal Python techniques for introspection,例如__class____dict__。这可能是更好的选择。