有一个名为“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/