详细说明:我通过解析配置文件获取到我即将显示的form的name,然后我有根据这个字符串创建了一个object类型的实例,
问我如何将其转化为对应的form类 ??
或者有没有其他办法来查找我这个工程中是否包含name为该字符串的form,然后将其实例化显示??
问我如何将其转化为对应的form类 ??
或者有没有其他办法来查找我这个工程中是否包含name为该字符串的form,然后将其实例化显示??
调试欢乐多
如果只是标题显示你读出来的信息,那随便new一个form,然后把name= “” 就可以了。
Assembly ass = Assembly.LoadFile("dll文件路径");//如果该DLL在你的BIN里面,你可以直接用
//Assembly ass=Assembly.Load("dll名");
Type t = ass.GetType("类的全名,命名空间+类名", false); if(t==null)
//则不存在
else
{
object obj=Activator.CreateInstance(t);
}
Form f;
switch (name)
{
case "Form1":
f = new Form1();
case "Form2":
f = new Form2();
......
}
if(str == "...") .....
else if()(str == "...") .....一般这些form都有一个相同的base类,优化一下:
先创建一个Dictionary
Dictionary<string, Type> CreationInfo = new Dictionary<string, Type>();
CreationInfo .Add(str, typeof(formName1));
CreationInfo .Add(str, typeof(formName2));
.......
一个static的CreateInstanceCF方法:
参数为1,str。 2,form初始化需要的参数List:lstValues 。
Type typInstance = (Type)this.CreationInfo [str];
object[] arrConstructionParams = new object[] { str, lstValues };
try
{
instance = (baseClass)Activator.CreateInstance(typInstance, arrConstructionParams);
}
catch(Exception ex)
{
throw new Exception(ex.ToString());
}
frm1.show();tt就是你的OBJECT型 试试
出错:未割り当てのローカル変数 'obj' が使用されました。
/// <summary>
/// 创建或获得MDI子窗口
/// </summary>
/// <param name="ParentForm">MDI父窗口</param>
/// <param name="ChildFormType">MDI子窗口类型</param>
/// <param name="Params">参数</param>
/// <param name="OnlyOne">是否只允许一个</param>
/// <param name="IsShow">是否显示</param>
/// <param name="IsMaximize">是否最大化</param>
/// <param name="SetMiddle">是否设置为中间</param>
/// <returns>MDI子窗口</returns>
public Form GetForm(Form ParentForm, Type ChildFormType, Object[] Params, bool OnlyOne, bool IsShow, bool IsMaximize, bool SetMiddle)
{
if (OnlyOne)
foreach (Form CF in ParentForm.MdiChildren)
if (CF.GetType() == ChildFormType)
{
CF.BringToFront();
return CF;
}
Form NewForm = null;
if (Params == null)
NewForm = (Form)(Activator.CreateInstance(ChildFormType));
else
NewForm = (Form)(Activator.CreateInstance(ChildFormType, Params));
NewForm.MdiParent = ParentForm;
NewForm.Icon = ParentForm.Icon;
NewForm.Size = new Size(800, 600);
if (IsMaximize)
NewForm.WindowState = FormWindowState.Maximized;
if (SetMiddle)
NewForm.StartPosition = FormStartPosition.CenterScreen;
if (IsShow)
NewForm.Show();
HelpAgentControl.DoAction(new Consts.SERVICE_HELPAGENT_ACTION_OPENWINODW(), false);
return NewForm;
}
#endregion
object obj;
string className = "frmMainForm"; Assembly[] assemblys = AppDomain.CurrentDomain.GetAssemblies();
bool is_find = false; foreach (Assembly a in assemblys)
{
if (a.GlobalAssemblyCache)
continue;
Type[] types = a.GetTypes(); foreach (Type t in types)
{
string tmp = t.ToString();
int i = tmp.LastIndexOf(className, StringComparison.OrdinalIgnoreCase); //确保匹配的是类名,而不是namespace
if (tmp.Length - className.Length == i)
{
if (!is_find)
{
//创建类实例
obj = a.CreateInstance(t.ToString());
is_find = true; //如果需要处理类库冲突,则不要中断循环
break;
}
else
{
//如果需要处理类库冲突,则throw
//throw new Exception("请使用更长的类限定名");
}
}
}
} Form frm = (Form)obj;
frm.Show();可是出现错误,上面已经帖出来过的:
未割り当てのローカル変数 'obj' が使用されました。
将object obj;改为object obj = null;
不过还是谢谢各位了!