好吧,我现在整天都在想这个想法,而且我已经达到了我承认我只是不知道的部分。可能我所做的只是愚蠢的,还有更好的办法,但这是我思想给我带来的地方。如何将类型名称转换为字符串?
我试图用一个通用的方法来加载形式的WinForms:
protected void LoadForm<T>(ref T formToShow, bool autoLoaded) where T : FormWithWorker, new()
{
// Do some stuff
}
的形式由一个ToolStripMenuItem(通过项目的选择或使用打开Windows菜单项)加载。它们是延迟加载的,因此MDI父级中有表单的字段,但在需要它们之前它们为空。我有一个用于处理所有菜单项点击的ToolStripMenuItem_Click的常用方法。除了ToolStripMenuItem的名称匹配为它们对应的表单类名称选择的模式之外,该方法没有真正知道调用哪个表单的方法。因此,使用ToolStripMenuItem的名称,我可以确定被请求的表单类型的名称以及分配用于存储该表单引用的专用字段的名称。
使用这个,我可以使用硬编码类型和字符串匹配的增长/收缩switch语句来调用具有特定类型集的方法(不受欢迎),或者我可以使用Reflection获取字段并创建实例的类型。对我来说问题是,System.Activator.CreateInstance
提供了一个ObjectHandler,它不能转换为我需要的类型。这里是我到目前为止的代码段:
string formName = "_form" + ((ToolStripMenuItem)sender).Name.Replace("ToolStripMenuItem", "");
string formType = formName.Substring(1);
FieldInfo fi = this.GetType().GetField(formName, BindingFlags.NonPublic | BindingFlags.Instance);
FormWithWorker formToLoad = (FormWithWorker)fi.GetValue(this);
if (formToLoad == null)
{
formToLoad = (????)System.Activator.CreateInstance("MyAssemblyName", formType);
}
this.LoadForm(ref formToLoad, false);
fi.SetValue(this, formToLoad);
我知道,去为(????)类型的字符串名称,但在编译的时候,我不知道是什么类型,因为它改变。我尝试了很多方法来让这个演员/实例化工作,但都没有成功。我非常想知道是否有可能只知道这种类型的字符串。我尝试使用Type.GetType(string, string)
来执行转换,但编译器不喜欢它。如果有人对如何动态加载表单有不同的想法,因为我只是在愚蠢地做,请让我知道。
make formToLoad对象,并将其转换为LoadForm和SetValue点处的FormWithWorker? – asawyer 2011-01-28 19:14:25