在数据库中查询功能菜单需要调用的Form窗体的名称,利用反射机制进行自动跳转,
主画面按钮事件:
button1_Click
  //如果自画面无参数,反射成功,带参数就会报错。
            string NameSpace = "Form1";
            string ClassName = "Win.Form1";//全路径。
            Assembly asm = Assembly.Load(NameSpace);
            Form frm = (Form)asm.CreateInstance(ClassName);
            frm.ShowDialog();
子画面及参数定义:
public Form1(string 名称,string 其他);
public Form2(string 名称,string 其他);
public Form3(string 名称,string 其他)
请高手指点下该如何将参数船体给子画面

解决方案 »

  1.   

    你的窗体是什么业务领域的窗体,你应该设计并发布出来接口。最终,这应该是MyForm frm = (MyForm)asm.CreateInstance(ClassName);这种业务规范对象,而不是什么 Form。过度抽象的人不懂抽象。真正懂抽象的人是基于落地了的具体的内涵(也就是接口规范)来设计开发的。不是什么都动不动说“反射”。
      

  2.   

    比如说你认为针对一个 object 应该调用其”喂饭“接口方法,并且输入输出的模式已经清楚了,那么请问你凭什么?凭的是接口定义。所以那些空洞地说反射的人是不行的。真正的使用反射的工厂模式程序,要基于接口编程。而不是空洞地搞什么”万能“代码。
      

  3.   

    起始我就是想利用下面的简单代码去调用一个带参数的画面,比如跳转“实时报警”这个画面时,需要向这个窗体传两个string类型的参数,不知道怎么弄。
    string NameSpace = "WinAlert";
    string ClassName = "WinAlert.实时报警";
    Assembly asm = Assembly.Load(NameSpace);
    Form frm = (Form)asm.CreateInstance(ClassName);
    frm.ShowDialog();
      

  4.   

     public partial class 实时报警 : Form
        {
            public string 报警类型Z = "";
            public string 报警名称Z = "";
            public string sddf = "";
            public 实时报警(string 报警类型,string 报警名称)
            {
                InitializeComponent();
                报警类型Z = 报警类型;
                报警名称Z = 报警名称;
            }
    }
      

  5.   

    一定要反射的话,就需要调用类型对象的  GetMethod 方法,找到你要查找的方法的 methodInfo 对象实例,然后调用其 Invoke 方法,提供调用参数(object[ ])。
    不过要清楚的是,你看任何一个主流的的工程该怎么设计系统。走偏门毕竟只是偶尔、无奈之举。软件说到底就是 0、1、0、1 一堆二进制,那么你可以说会一点二进制概念也能“万能地”调用任何 DLL。但是要工程化,去讲究设计开发效率的人,才是真正有用的工程师,而不是纠结与底层代码出不来的。
      

  6.   

    你自己写了 Win.Form1 之类的代码,那么我就要告诉你,像一个架构设计师一样去设计产品规范,展示工厂模式动态反射机制,这个时候你需要对业务领域的 Form 定义自己的接口(或者是 Abstract 类),而不是一味地 Invoke 反射代码。