如何像类型一样使用变量?

时间:2018-01-17 04:35:48

标签: c# winforms

这里我试图创建WinForm的对象,其名称在数据库表中,我通过var getChildForm = mnuService.GetChildNodeForm(menuName);服务获取表单名称。由于还有其他形式我也必须访问,所以我想让它通用,但在getChildForm usrCrtFrm = new getChildForm();行上有一个错误说' getChildForm'是一个变量但是像一个类型一样使用。

以下是我的代码

var getChildForm = mnuService.GetChildNodeForm(menuName);               
getChildForm usrCrtFrm = new getChildForm();
usrCrtFrm.Show();



以下是我的服务

    public string GetChildNodeForm(string menuTitle)
    {
        var getMenuId = uow.Repository<MainMenu>().FindBy(x => x.MenuTitle == menuTitle).FirstOrDefault().MenuId;
        return uow.Repository<MainMenu>().FindBy(x => x.MenuId == getMenuId).FirstOrDefault().Url;
    }



任何帮助将不胜感激。谢谢你

3 个答案:

答案 0 :(得分:1)

如果你有Type表单,那么你可以很容易地做到这一点:

var type = typeof(MyForm);
var form = Activator.CreateInstance(type);

但是,如果你没有这种类型怎么办?好吧,你不能直接从它的标题实例化一个表单,它的名字&#34; (无论这意味着什么),它的菜单项或其URL。您需要一些机制将其中一个映射回到表单的类型。

可以使用某种映射;例如,如果具有页面的URL,则可以使用ASP.NET框架将其映射到处理程序。但是没有将标题或菜单映射到WinForm类型的机制。

如果您的数据库返回类型 name ,您可能会找到如下类型:

public Form InstantiateFormFromTypeName(string typeName)
{
    var type = System.Reflection.Assembly.GetExecutingAssembly()
       .GetTypes()
       .Where
       (
           t => t.FullName == typeName 
             && typeof(Form).IsAssignableFrom(t)
       )
       .Single();
    return Activator.CreateInstance(type) as Form;
}

...但你需要注意范围和名称。例如,可能有几个具有相同名称但在不同名称空间或不同程序集中的类型。

如果没有可用的自动映射,如果您提前知道表单的名称,则可以创建自己的映射。例如,如果将映射存储在字典中,则可以使用它来创建实例。例如:

//Define a dictionary where the key is the form name and the value
//is a function that will return a new instance of it.
var formList = new Dictionary<string, Func<Form>>
{
    { "Signon",    () => new LoginForm()    },
    { "Edit User", () => new EditUserForm() },
    { "Help",      () => new FaqForm()      }
};

//Use the dictionary to create a form
public Form InstantiateFormBasedOnName(string name)
{
    return formList[name]();  //Execute the function stored at index "name" in the dictionary
}

答案 1 :(得分:0)

getChildForm usrCrtFrm = new getChildForm();

在上面的代码行中,您尝试创建getChildForm的{​​{1}}类型的对象,并且您尝试将局部变量用作类型。我找到了How to use Local variable as a type? Compiler said “it is a variable but is used like a type” 。希望它会有用。

答案 2 :(得分:-1)

第一个语句将返回一个类似于表单路径(url)的字符串。

var getChildForm = mnuService.GetChildNodeForm(menuName);

所以这个语句的返回类型是一个字符串,我猜是一个表单url。它可能是这样的。

var childFormUrl = mnuService.GetChildNodeForm(menuName);

在此之后你应该创建一个类(例如FormCreatorClass),它有一个函数(例如GetForm,它将url作为参数),它返回一个表单对象。 现在,您可以创建此类的实例,并通过类实例

的变量调用该类的函数
var formCreatorInstance = new FormCreatorClass();
var form = fromCreatorInstance.GetForm(childFormUrl);
form.Show();