如何通过它的名称(字符串)调用Widows表单对象?

时间:2015-09-11 13:56:25

标签: c# string winforms object methods

通常我们会创建一个像

这样的表单
MainForm form1 = new MainForm();
form1.show();

但我想把这个形式1称为它的名字,就像这样;

string FormName = "MainForm";

// a method should be here that gives us form1 from FormName
// then;

form1.show();

我该怎么做? 事实上,我的目标是通过字符串名称显示一个表单,该表单来自sql数据库。因为我的项目中有太多的窗体,所以我更喜欢在sql数据库上调用窗体

2 个答案:

答案 0 :(得分:1)

选项1:

如果名称与示例中的类型名称相同,则可以使用反射:

private static string namespacePrefix = "MyNamespace.";

public static Form CreateFormByName(string formName)
{
    Assembly myAssembly = Assembly.GetExecutingAssembly();
    Type formType = myAssembly.GetType(namespacePrefix + formName);
    if (formType == null)
        throw new ArgumentException("Form type not found");
    return (Form)Activator.CreateInstance(formType);
}

选项2:

当类型名称和表单名称不同时,您应该使用字典映射:

private static Dictionary<string, Type> mapping = new Dictionary<string, Type>
{
    { "MainForm", typeof(Form1) },
    { "frmOptions", typeof(OptionsForm) },
    // ...
}

public static Form CreateFormByName(string formName)
{
    Type formType;
    if (!mapping.TryGetValue(formName, out formType))
        throw new ArgumentException("Form type not found");
    return (Form)Activator.CreateInstance(formType);
}

答案 1 :(得分:0)

这可以通过Type.GetTypeActivator.CreateInstance方法实现。 Activator方法将返回表示新创建对象的object类型。

string FormName = "MainForm";
Type t = Type.GetType(FormName);
Form f = Activator.CreateInstance(t) as Form;
f.show();