c# 反射机制 在线等......

sirtener 2009-12-24 04:54:20
请教大家一个问题,在C#开发winform中, 知道窗体的name值,怎样通过反射机制来创建对应的窗体(注:有多个窗体且不在同一个文件夹里)??????
...全文
144 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsyok 2009-12-30
  • 打赏
  • 举报
回复
sirtener 2009-12-30
  • 打赏
  • 举报
回复
谢谢大家热情的帮助和建议,这段时间我也在探寻这个反射机制,综合大家的建议终于得到想要的效果。目前做的C/S模式的WINFORM程序中,做到权限控制这块,想通过窗体类的名称获取该窗体里的功能项目,主要包括toolBar,linkLabel,Button等,还好我把窗体类集中的放在同一个命名空间里,所以在利用反射机制的时候就比较简单。属于这几位朋友提供的方法的特例:
[Quote=引用 11 楼 lovelj2012 的回复:]
引用 6 楼 ginni215 的回复:
Form myForm=Assembly.Load("程序集").CreateInstance("程序集.窗体名");

Assembly.Load("程序集").CreateInstance("程序集.窗体名/类名")是object类型的,要显式进行类型转换的。Form myForm=(Form)Assembly.Load(".dll").CreateInstance("程序集.窗体名/类名")
[/Quote]
主要代码是 :

object _form = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(formNameSpace+"."+formName, false);

最后还是衷心的感谢大家的参与,谢谢......
linekery 2009-12-25
  • 打赏
  • 举报
回复
activator 很简单的 知道 type 就行
江南小鱼 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ginni215 的回复:]
Form myForm=Assembly.Load("程序集").CreateInstance("程序集.窗体名");
[/Quote]
Assembly.Load("程序集").CreateInstance("程序集.窗体名/类名")是object类型的,要显式进行类型转换的。Form myForm=(Form)Assembly.Load(".dll").CreateInstance("程序集.窗体名/类名")
zby0844 2009-12-25
  • 打赏
  • 举报
回复
贴一个正在进行的项目的实现方法吧,我做第一个项目C#
大概思路是在 数据库中配置好实现的窗口类,和构造函数所需的参数
客户端自动生成菜单,并且调用相应的窗口类,就是楼主说的反射
MenuitemBean b = ((sender as ToolStripItem).Tag as MenuitemBean);
try
{
Type tt = Type.GetType(b.CKL.Trim());
FormBasic f;
if (b.Params == "")
{
f = (FormBasic)Activator.CreateInstance(tt);
}
else
{
object[] param = b.Params.Split(',');
f = (FormBasic)Activator.CreateInstance(tt, param);
}
f.MKQD = b.MKBM;
f.MdiParent = this;
new ERPCommon.SaleSVR.Service().WriteOperateLog(ERPCommon.PublicVariable.User, b.MKBM, "进入", "进入模块");
f.FormClosed += new FormClosedEventHandler(f_FormClosed);
f.Show();
f.WindowState = (System.Windows.Forms.FormWindowState)b.CKZT;
}
catch (Exception ep)
{
MessageBox.Show("模块清单中窗口类配置错误,类前需要命名空间!\n" + ep.Message);
}
zhongjiekangping 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuyq11 的回复:]
string path=AssemblyName;
string name=strName;

Form fm=(Form)Assembly.Load(path).CreateInstance(name);
fm.MdiParent=this.ParentForm;
fm.Show();
fm.Dock=DockStyle.Fill;

[/Quote]
up
wuyq11 2009-12-24
  • 打赏
  • 举报
回复
string path=AssemblyName;
string name=strName;

Form fm=(Form)Assembly.Load(path).CreateInstance(name);
fm.MdiParent=this.ParentForm;
fm.Show();
fm.Dock=DockStyle.Fill;
ginni215 2009-12-24
  • 打赏
  • 举报
回复
Form myForm=Assembly.Load("程序集").CreateInstance("程序集.窗体名");
ProjectDD 2009-12-24
  • 打赏
  • 举报
回复
YourType yt;
var types=Assembly.Load("xxx.dll").GetTypes();

foreach(var item in types){
if(item.Name=="name"){
yt=item.GetConstructor(Type.EmptyTypes).Invoke(null) as YourType;
break;
}
}

//在指定程序集下查,查到你的类型,然后反射的调用 构造函数进行实例化。
fengjian_428 2009-12-24
  • 打赏
  • 举报
回复
这问题我今天刚回答过一次
自己去看吧http://topic.csdn.net/u/20091224/16/fc7c99c2-7fd2-4f36-ad70-b9449970db4f.html
  • 打赏
  • 举报
回复

Assembly a = Assembly.LoadFile(@"path/filename.dll|exe");//加载程序集
string className = "namespace.classname";//完整的类名,包括命名空间
Type t = Type.GetType(className);//根据类名获取类型
MyForm f = Activator.CreateInstance(t) as MyForm;//根据类型创建窗体实例


注意需要在工程中添加对该程序集的引用(主要是为了知道MyForm的类型
KKND2006 2009-12-24
  • 打赏
  • 举报
回复
程序和文件夹有什么关系?难道你要调用外部程序的窗口?

如果知道窗口类的名字,用activator就可以创建实例了
wholesale3151 2009-12-24
  • 打赏
  • 举报
回复
sorry,i dont know,hope next man solve it for youchinese wholesalers

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧