ironpython - IronPython 类型的命名空间和程序集名称如何工作?

标签 ironpython

有一个名为“Entities”的 IronPython 包。该包包含一个“Entity.py”文件,该文件定义了“Customer”类和“Address”类。

如果我运行这个程序:

customer = Customer()
print customer.GetType().AssemblyQualifiedName
address = Address()
print address.GetType().AssemblyQualifiedName

我得到这个输出:

IronPython.NewTypes.System.Object_1$1, Snippets.scripting, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
IronPython.NewTypes.System.Object_1$1, Snippets.scripting, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

这是如何运作的?为什么两种类型具有相同的类型名称 (Object_1$1)?

我必须使用需要类型的程序集限定名称的 API 来创建该类型的实例。我希望能够以这种方式使用它:

customer = aFactory.Create("Entities.Customer, Entities");

我该怎么做?有没有办法指定命名空间和程序集名称?

谢谢

最佳答案

您想要查看clrtype这是 IronPython 2.6 中的新增功能。它使您能够控制发出的类型,并且有一些很好的示例以及预烘焙的解决方案,其中之一可能适用于此。

类型相同的原因是 IronPython 只需要使用 .NET 类型系统做这么多事情。这包括重写基类型上的任何虚拟方法,以及通过将它们包含在基列表中来实现您请求的任何接口(interface)。除此之外,所有类型都是相同的,并且它们实际上是通过动态查找其 PythonType 对象来定义的。例如,在 Object_1$1 中,我们定义了“ToString”的重写,它将在当前 PythonType 的解析顺序中查找 ToString 是否已定义,如果是,我们将调用它。这使得对象的 PythonType 成员能够在运行时更改,甚至允许实际的 python 类型在运行时更改。另外,如果我们不这样做,定义类就会泄漏内存,因为 .NET 类型不可收集。

关于ironpython - IronPython 类型的命名空间和程序集名称如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1964553/

相关文章:

visual-studio - 在不购买 VS 的情况下如何使用 IronLanguages 的工具?

web-services - 尝试使用ironpython和soap调用Web服务

c# - IronPython - 从 C# 发出警告

由于猴子补丁的能力,.NET 4 可以实现更好的单元测试/模拟?

c# - 从 C# 构建 Python 脚本和调用方法

c# - 无法在 Visual Studio 中使用 IronPython 运行带有库的 python 脚本

python - 从 IronPython Access MS Access 时出现问题

linux - 如何在 Linux 上调用 IronPython

c# - 从 C# 操作 Python 文件

.net - IronPython - 将 int 转换为字节数组