摘要:背景:两个CustomControl,一个叫做MyPanel,是一个M*N的格子,一个叫做Ball,是一个球。球可以放在panel的格子中,可以鼠标进行drag & drop.
直接call很简单,没有任何问题。但是通过reflection,碰到了郁闷的事情。虽然最终搞定了,但是要看过InvokeMember的代码才能知道为什么。
代码:
Object panel = null; Type tpanel = null;
private void ReflectionForm_Load(object sender, EventArgs e) { Assembly asm = Assembly.LoadFile(@"D:\test\WindowsApplication5\MyLibrary\bin\Debug\mylibrary.dll"); tpanel = asm.GetType("MyLibrary.MyPanel"); panel = tpanel.InvokeMember("", BindingFlags.CreateInstance, null, this, new object[] { }); (panel as Control).Location = new Point(100, 100); this.Controls.Add(panel as Control); }
出错的地方:
tpanel.InvokeMember("AddBall", BindingFlags.Instance | BindingFlags.Public|BindingFlags.InvokeMethod, null, panel, new object[] { obj });
如果上面的panel是object类型,那么一切正常。如果是Control类型,即,我声明为:Control panel,然后object obj = tpanel.InvokeMember("", BindingFlags.CreateInstance, null, this, new object[] { });panel = object as Control;panel.Location = new Point(100,100);this.Controls.Add(panel);
那么上面的InvokeMember就会提示我:Method not found!如果我修改BindingFlags,去掉Method,那么没有MethodNotFound的exception,但是会有“请使用InvokeMethod,Set/Get Field之类的提示”。如果加上,就是MethodNotFound,真是faint!
google了一些,貌似有些人碰到过,一个post上面说,arguments的类型必须要和method的类型完全一致才可以。我想,如果Panel当作control来用,那么control -> Ball类型会无法转换的,而object -> Ball是允许的。
哪位高手帮忙解释一下?谢谢!...[
阅读全文]