none
Form frm = Activator.CreateInstance(type) as Form; //创建反射窗体实例 建立窗体的实例; RRS feed

  • 问题

  • 本人刚开始学习VS.C# 2008 

    学习过程中遇到以下问题,一直未解决,请各位大大,帮忙,谢谢!

    sing System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Reflection;

    namespace FTYT
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                OpenForm("CompanyInfo");
            }

            private void OpenForm(string strForm)
            {
                string n = Assembly.GetExecutingAssembly().GetName().Name;
                strForm = n + "." + strForm;
                Type type = Type.GetType(strForm);
                if (type != null)//查看反射是否成功
                {
                    if (typeof(Form).IsAssignableFrom(type)) //反射结果是否为窗体Form  关键的判断
                    {
                        Form frm = Activator.CreateInstance(type) as Form; //创建反射窗体实例  建立窗体的实例; 这里报错:没有为该对象定义无参数的构造函数。
                        frm.Show();
                    }
                    else
                    { MessageBox.Show("指定的类型不能是从Form类型继承", "温馨提示"); }
                }
                else
                { MessageBox.Show("指定的类型不存在", "温馨提示"); }
            }

    2013年6月3日 2:42

答案

  • 如果你的CompanyInfo这个窗体没有无参数的构造函数就会出现这个错误的,你可以再你的CompanyInfo中加一个无参数的构造函数,即如下:

    public CompanyInfo()
    {
    
    }

    如果不想加一个无参数构造函数,你可以调用CreateInstance(Type.Object[])方法来创建实例,例如:

    // arg1是与你类构造函数参数对应的一个类型
    Activator.CreateInstance(type,new object[] {arg1})


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年6月3日 4:09
  • hello,

    因为你的对象构造函式有参数,你必须要把参数弄进去,比如以下代码

    var instance = Activator.CreateInstance(assemblyType, (BindingFlags.Instance | BindingFlags.NonPublic), null, para, null);

    详细做法请参考以下

    http://www.dotblogs.com.tw/yc421206/archive/2012/10/31/79794.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年6月4日 4:05

全部回复