反射高手请进。(关于委托的反射)

Alton1981 2003-10-17 02:49:42
我有一个MDI程序,主窗口名称为MainFrm;MainFrm有两个子窗体分别为From1,Form2。在MainFrm的程序中,我通过构造器反射的方法,得到了一个已知Form名称的一个实例。如:
Form frm;
Type t = Type.GetType("NameSpaceName."+ FormName);
ConstructorInfo myConstructorInfo = t.GetConstructor(new Type[0]);
object obj = myConstructorInfo.Invoke(new object[0]);
frm=(Form)obj;
frm就是我要的一个子窗体的实例。
现在假设frm为Form1的一个实例,Form1上有一个方法,设为void f(int,int);在MainFrm上我定义了一个委托:
public delegate void myDelegate(int,int); //申明委托;
public myDelegate md=new myDelegate(frm.f); //Error;原本想调用Form1上的
//f(int,int)的方法,但不知
//如何实现;
md(1,2); //调用委托函数;
我不知道如何用反射实现委托,请高手指教。谢谢!
...全文
30 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alton1981 2003-10-20
  • 打赏
  • 举报
回复
我的问题解决了,谢谢LevinForum(forum.lostinet.com)的提示,非常感谢!散分。
好运 2003-10-17
  • 打赏
  • 举报
回复
借用宝地,如果写在两个不同的.cs中的委托,如果类型想同怎样转化
dudejava 2003-10-17
  • 打赏
  • 举报
回复
再来


public MainFormFunction(Object form,int i1,int i2)
{

Type typef = typeof(form);
Type[] typeArray =new Type[2];
typeArray[0]=typeof(System.Int32);
typeArray[1]=typeof(System.Int32);
MethodInfo methodInfo = typef .GetMethod("f",typeArray);
if(methodInfo != null)
{
Object[] os=new Object[2];
Object[0]=i1;
Object[2]=i2;
methodInfo .Invoke(form, os));
}

}
打字好辛苦,就楼主忍一下,给分吧。
LevinForum 2003-10-17
  • 打赏
  • 举报
回复
...
参考:Delegate.CreateDelegate
Alton1981 2003-10-17
  • 打赏
  • 举报
回复
我现在是想调用新建实例的f(int,int)方法,但frm是Form类型,没有f(int,int)方法,所以就错在这里。现在我就是不想用switch...case...方法,dudejava(北城苍蝇) 的方法还是要作判断,更本就没用反射,所以希望高手能指条明路,谢谢!
ibmlihw 2003-10-17
  • 打赏
  • 举报
回复
Type t = Type.GetType("MdiForm_reflect.Form2");
ConstructorInfo myConstr = t.GetConstructor(new Type[0]);
object obj = myConstr.Invoke(new object[0]);
frm = (Form)obj;
md = new MyDele(((Form2)frm).add);
md(1,2);
dudejava 2003-10-17
  • 打赏
  • 举报
回复
可以修改为:
1.MainFrm上:
public delegate void myDelegate(int,int); //申明委托;

private Form1 f1;
private Form2 f2;
public myDelegate md=new myDelegate(MainFormFunction);
public MainFormFunction(int i1,int i2)
{
.............
(Form1)f1.f(i1,i2);
(Form2)f2.f(i1,i2);



}
dudejava 2003-10-17
  • 打赏
  • 举报
回复
说错了,其实子窗体就是父窗体的成员。
dudejava 2003-10-17
  • 打赏
  • 举报
回复
呵呵!接分罗!!!

1.MainFrm上:
public delegate void myDelegate(Object,int,int); //申明委托;
public myDelegate md=new myDelegate(MainFormFunction);
public MainFormFunction(Object form,int i1,int i2)
{
if(Type.GetType("NameSpaceName. Form1")==typeof(form))
{
(Form1)form.f(i1,i2);
}
else if(Type.GetType("NameSpaceName. Form2")==typeof(form))
{
(Form2)form.f(i1,i2);
}
}

实现委托的方法要子窗体的对象实例为参数,否则就把子窗体作为父窗体的成员。



xghost 2003-10-17
  • 打赏
  • 举报
回复
up

110,536

社区成员

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

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

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