我需要在运行时实例化包含表单的dll实例。目前我有一个很长的转换声明,有75个以上的案例并且发展很快。由于这已全部开发,我们还开发了一个List,其中包含动态调用表单的所有信息。
现在案例
...
case "state"
State state = new State();
state.Parent = this.Parent;
state.ScreenNameLong = "State ";
state.ScreenTitle = "St11 - State";
state.SetupForm();
this.OpenForm(state, state.ScreenTitle);
break;
...
所需的所有信息现在都包含在名为menuItem的列表元素中,该元素已被选中。它有form(" State"),ScreenNameLong,ScreenTitle等。所有要调用的表单都有Parent对象和SetupForm()方法。
使用"""引用所有dll。陈述和项目参考。 似乎我应该能够以某种方式做一些类似的事情,一次:
Form formToLaunch = (menuItem.form);
formToLaunch.Parent = this.Parent;
formToLaunch.ScreenNameLong = menuItem.descr;
formToLaunch.ScreenTitle = menuItem.scrNumber + " " + formToLaunch.ScreenNameLong;
formToLaunch.SetupForm();
this.OpenForm(formToLaunch, formToLaunch.ScreenNameLong );
我已经把头撞到了墙上,没有找到一个很好的解决方案。我已经研究过使用反射和界面,他们似乎不适合这个法案,或者我只是没有得到它......
答案 0 :(得分:0)
所有表单都需要实现定义公共成员的接口,例如:
interface IForm : IDisposable
{
Form Parent { get; set; }
string ScreenNameLong { get; set; }
string ScreenTitle { get; set; }
void SetupForm();
}
此处IForm
根据以下dbc的评论继承IDisposable
。
从typename中获取Type(可能在您的menuItem.form
中)。你可能需要解决这个问题:
var type = Type.GetType("form_namespace." + menuItem.form + ", form_assembly_name");
实例化类型,强制转换为界面,并随意执行任何操作:
var formToLaunch = Activator.CreateInstance(type) as IForm;
if (formToLaunch != null)
{
formToLaunch.Parent = this.Parent;
formToLaunch.ScreenNameLong = menuItem.descr;
formToLaunch.ScreenTitle = menuItem.scrNumber + " " + formToLaunch.ScreenNameLong;
formToLaunch.SetupForm();
this.OpenForm(formToLaunch, formToLaunch.ScreenNameLong);
}