动态反射方法的问题

happydayandday 2012-06-27 02:45:15
有个问题请教下,
用反射方法调用时,为什么没法初始化当前窗体的控件内容
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";
}
}
...全文
144 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
__天涯寻梦 2012-06-27
  • 打赏
  • 举报
回复
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");
happydayandday 2012-06-27
  • 打赏
  • 举报
回复
2个方法都写在TTWinForm类中了
happydayandday 2012-06-27
  • 打赏
  • 举报
回复
TTWinForm.OpenChildWindow(this, typeof(TrainDo).ToString())
就是打开子窗口
__天涯寻梦 2012-06-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
子窗体已经打开,想调用其方法
[/Quote]
调用这些方法的代码也贴出来
happydayandday 2012-06-27
  • 打赏
  • 举报
回复
子窗体已经打开,想调用其方法
happydayandday 2012-06-27
  • 打赏
  • 举报
回复
//先打开一个子窗体(只是一个实例)
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";
}
}

__天涯寻梦 2012-06-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 2 楼 的回复:
你新建了个窗体的实例,改也改不到原窗体上

C# code

public class TTWinForm
{
public static void InvokeChildMethod(Type type, string methodName, object instance)
{
object form = Activator.CreateInst……
……
[/Quote]
那你把执行
TTWinForm.InvokeChildMethod(typeof(TrainDo).ToString(), "LoadForm");
这行代码的地方的其余代码贴出来
happydayandday 2012-06-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
你新建了个窗体的实例,改也改不到原窗体上

C# code

public class TTWinForm
{
public static void InvokeChildMethod(Type type, string methodName, object instance)
{
object form = Activator.CreateInst……
[/Quote]
这个方法不行,我已经启动了子窗体的实例,想动态反射启动窗口的方法来实现
__天涯寻梦 2012-06-27
  • 打赏
  • 举报
回复
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);
yybb520 2012-06-27
  • 打赏
  • 举报
回复
methodInfo.Invoke(form, null);
第一个参数已经你传入要方法所属的对象实例,此处你可以直接传入之前已打开窗体的实例!但是即然这样了,反射还有何价值呢?朋友Q
happydayandday 2012-06-27
  • 打赏
  • 举报
回复
能不能不创建实例,并动态反射方法,其实要启动的窗体已经在调用之前启动了
yybb520 2012-06-27
  • 打赏
  • 举报
回复
楼上说得很有道理,通过反射实例化后的对象,并非你show出来的窗体,!
__天涯寻梦 2012-06-27
  • 打赏
  • 举报
回复
你新建了个窗体的实例,改也改不到原窗体上
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);
happydayandday 2012-06-27
  • 打赏
  • 举报
回复
button1.Text = "1212";
不起作用

110,537

社区成员

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

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

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