C#winforms在运行时实例化未知(在设计时)表单(后期绑定?)

时间:2014-11-06 21:22:58

标签: c# winforms reflection binding interface

我需要在运行时实例化包含表单的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 );

我已经把头撞到了墙上,没有找到一个很好的解决方案。我已经研究过使用反射和界面,他们似乎不适合这个法案,或者我只是没有得到它......

1 个答案:

答案 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);
}