I have a class called ElementFactory that loads up one or more python scripts into an IronPython.Hosting engine, and exposes my object model to those scripts. It then tries to instantiate classes that are defined in the scripts.
I have a test script that looks like this:
from Designer.Schema import Element
class TextStr(Element):
def __new__():
System.Windows.Forms.MessageBox.Show("__new__0")
def __new__(self):
System.Windows.Forms.MessageBox.Show("__new__1")
def __new__(self, a2):
System.Windows.Forms.MessageBox.Show("__new__2")
def __new__(self, a2, a3):
System.Windows.Forms.MessageBox.Show("__new__3")
def __new__(self, a2, a3, a4):
System.Windows.Forms.MessageBox.Show("__new__4")
def __init__():
System.Windows.Forms.MessageBox.Show("__init__0")
def __init__(self):
System.Windows.Forms.MessageBox.Show ("__init__1")
def __init__(self, a2):
System.Windows.Forms.MessageBox.Show("__init__2")
def __init__(self, a2, a3):
System.Windows.Forms.MessageBox.Show("__init__3")
def __init__(self, a2, a3, a4):
System.Windows.Forms.MessageBox.Show("__init__4")
While I can locate the definition of the TextStr type (by finding UserType objects in module.Globals) and can get an instance of something that seems to be a TextStr (by using UserType.AllocateObject), I'm not sure it's actually working. The returned object is named 'Element_1', has a __type__ member that says 'TextStr' and it is a valid Element that runs the inherited constructor when created. But none of the __new__ or __init__ overloads I defined are being run when the object is created, which implies that something strange is going on. I can't figure out what this Element_1 object actually is or why calling UserType.AllocateObject isn't doing what I expect it to do. The only other way I can find in the API to construct a python type dynamically is using Evaluate, which is not a usable solution for my circumstances, since when I load each of these scripts in as modules, they aren't defined in the default module and can't be seen by expressions passed into Evaluate.
Am I just misunderstanding how this stuff works? Is it not possible to derive from a C# type in IronPython?
Here is the basic boilerplate code I'm using, trimmed for space:
public bool LoadScript(string filename) {
FileInfo info = new FileInfo(filename);
OptimizedEngineModule module = Engine.CreateOptimizedModule(filename, info.Name.Replace(".py", ""), true);
module.Execute();
EnumTypes(module.Globals);
return true;
}
public void EnumTypes(IDictionary<string, object> globals) {
foreach (KeyValuePair<string, object> pair in globals) {
UserType type = pair.Value as UserType;
if (type != null)
if (!Types.ContainsKey(type.Name))
Types.Add(type.Name, type);
}
}
public Element Construct(string typename, Document document, string id) {
UserType type = Types[typename];
return type.AllocateObject(document, id) as Element;
}
_______________________________________________ users mailing list [email protected] http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
