拥有一个名为“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");
我该怎么做?有没有办法指定命名空间和程序集名称?
由于
答案 0 :(得分:5)
您想要查看IronPython 2.6中新增的clrtype。它使您能够控制发射的类型,并且有一些好的样品可以使用预先制作的解决方案,其中一个可能适用于此处。
类型相同的原因是IronPython只需要使用.NET类型系统做很多事情。这包括覆盖基类型上的任何虚方法,并通过将它们包含在基本列表中来实现您请求的任何接口。除此之外,所有类型都是相同的,并且它们实际上是通过动态查找到他们的PythonType对象来定义的。因此,例如在Object_1 $ 1中,我们定义了一个“ToString”的覆盖,它将在当前PythonType的分辨率顺序中查找,以查看是否已定义ToString,如果是,我们调用它。这使得对象的PythonType成员能够在运行时更改,甚至允许实际的python类型在运行时更改。此外,如果我们不做这样的定义类会泄漏内存,因为.NET类型不可收集。