这里我试图创建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;
}
任何帮助将不胜感激。谢谢你
答案 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();