有个问题请教下,
用反射方法调用时,为什么没法初始化当前窗体的控件内容
public class TTWinForm
{
  public static void InvokeChildMethod(string ChildTypeString, string methodName)
        {
            Type type = Type.GetType(ChildTypeString);
            object form = Activator.CreateInstance(type);
            MethodInfo methodInfo = type.GetMethod(methodName);
            methodInfo.Invoke(form, null);
        }
}TTWinForm.InvokeChildMethod(typeof(TrainDo).ToString(), "LoadForm"); 
被调用的子窗体
 public partial class TrainDo : Form
    {
public void LoadForm()
        {
            button1.Text = "1212";
}
}

解决方案 »

  1.   

    button1.Text = "1212";
    不起作用
      

  2.   

    你新建了个窗体的实例,改也改不到原窗体上
    public class TTWinForm
    {
        public static void InvokeChildMethod(Type type, string methodName, object instance)
        {
            object form = Activator.CreateInstance(type);
            MethodInfo methodInfo = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public);
            methodInfo.Invoke(instance, null);
        }
    }TTWinForm.InvokeChildMethod(typeof(TrainDo), "LoadForm", this);  
      

  3.   

    楼上说得很有道理,通过反射实例化后的对象,并非你show出来的窗体,!
      

  4.   

    methodInfo.Invoke(form, null);
    第一个参数已经你传入要方法所属的对象实例,此处你可以直接传入之前已打开窗体的实例!但是即然这样了,反射还有何价值呢?朋友Q
      

  5.   

    2楼的代码残留了那行创建实例的代码,完整的如下
    public class TTWinForm
    {
        public static void InvokeChildMethod(Type type, string methodName, object instance)
        {
            MethodInfo methodInfo = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public);
            methodInfo.Invoke(instance, null);
        }
    }TTWinForm.InvokeChildMethod(typeof(TrainDo), "LoadForm", this);  
      

  6.   

    那你把执行
    TTWinForm.InvokeChildMethod(typeof(TrainDo).ToString(), "LoadForm");
    这行代码的地方的其余代码贴出来
      

  7.   

    //先打开一个子窗体(只是一个实例)
    TTWinForm.OpenChildWindow(this, typeof(TrainDo).ToString())
    然后调用其方法LoadForm
    TTWinForm.InvokeChildMethod(typeof(TrainDo).ToString(), "LoadForm"); 
    public class TTWinForm
    {
       /// <summary>
            /// MDI打开子窗口(只是一个实例)
            /// </summary>
            /// <param name="MDIForm">父窗口</param>
            /// <param name="ChildTypeString">子窗口类型</param>
            public static void OpenChildWindow(System.Windows.Forms.Form MDIForm, string ChildTypeString)
            {
                if (!ContainMDIChild(MDIForm, ChildTypeString))
                {
                    Assembly assembly = Assembly.GetExecutingAssembly();
                    Type typForm = assembly.GetType(ChildTypeString);
                    Object obj = typForm.InvokeMember(
                        null,
                        BindingFlags.DeclaredOnly |
                        BindingFlags.Public | BindingFlags.NonPublic |
                        BindingFlags.Instance | BindingFlags.CreateInstance,
                        null,
                        null,
                        null);                if (obj != null)
                    {
                        Form myChild = obj as Form;
                        myChild.MdiParent = MDIForm;
                        myChild.Show();
                        myChild.Focus();
                    }
                }
            }        /// <summary>
            /// 查找是否包含子窗口
            /// </summary>
            /// <param name="MDIForm">父窗口</param>
            /// <param name="ChildTypeString">子窗口类型</param>
            /// <returns></returns>
            private static bool ContainMDIChild(System.Windows.Forms.Form MDIForm, string ChildTypeString)
            {
                Form myMDIChild = null;
                foreach (Form f in MDIForm.MdiChildren)
                {
                    if (f.GetType().ToString() == ChildTypeString)
                    {
                        myMDIChild = f;
                        break;
                    }
                }            // 显示存在的form
                if (myMDIChild != null)
                {
                    myMDIChild.TopMost = true;
                    myMDIChild.Show();
                    myMDIChild.Focus();
                    return true;
                }
                else
                    return false;
            }
      public static void InvokeChildMethod(string ChildTypeString, string methodName)
      {
      Type type = Type.GetType(ChildTypeString);
      object form = Activator.CreateInstance(type);
      MethodInfo methodInfo = type.GetMethod(methodName);
      methodInfo.Invoke(form, null);
      }
    }TTWinForm.InvokeChildMethod(typeof(TrainDo).ToString(), "LoadForm");  
    被调用的子窗体
     public partial class TrainDo : Form
      {
    public void LoadForm()
      {
      button1.Text = "1212";
    }
    }
      

  8.   

    TTWinForm.OpenChildWindow(this, typeof(TrainDo).ToString())
    就是打开子窗口
      

  9.   

    TTWinForm 修改下
    public class TTWinForm
    {
        /// <summary>
        /// MDI打开子窗口(只是一个实例)
        /// </summary>
        /// <param name="MDIForm">父窗口</param>
        /// <param name="childType">子窗口类型</param>
        /// <returns></returns>
        public static Form OpenChildWindow(Form MDIForm, Type childType)
        {
            Form f = ContainMDIChild(MDIForm, childType);
            if (f == null)
            {
                f = (Form)Activator.CreateInstance(childType);
                f.MdiParent = MDIForm;
            }        f.Show();
            f.Focus();        return f;
        }    /// <summary>
        /// 查找是否包含子窗口
        /// </summary>
        /// <param name="MDIForm">父窗口</param>
        /// <param name="childType">子窗口类型</param>
        /// <returns></returns>
        private static Form ContainMDIChild(Form MDIForm, Type childType)
        {
            foreach (Form f in MDIForm.MdiChildren)
            {
                if (f.GetType() == childType)
                {
                    f.TopMost = true;
                    return f;
                }
            }        return null;
        }    public static void InvokeChildMethod(Form f, Type childType, string methodName)
        {
            MethodInfo methodInfo = childType.GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
            methodInfo.Invoke(f, null);
        }
    }调用时
    Type t = typeof(TrainDo);
    Form f = TTWinForm.OpenChildWindow(this, t);
    TTWinForm.InvokeChildMethod(f, t, "LoadForm");