一个委托和反射的疑难问题,求教。

sgyiliya 2014-09-05 12:28:12


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

private void button1_Click(object sender, EventArgs e)
{
List<雇员类> _雇员类泛型实例对象 = new List<雇员类>();
_雇员类泛型实例对象.Add(new 雇员类(40000));
_雇员类泛型实例对象.Add(new 雇员类(65000));
_雇员类泛型实例对象.Add(new 雇员类(95000));

MethodInfo mi = typeof(雇员类).GetMethod("加薪方法", BindingFlags.Public | BindingFlags.Instance);

委托类型 _委托变量 = (委托类型)Delegate.CreateDelegate(typeof(委托类型), mi);//绑定方法,为什么方法参数表不一致也可以绑定?
foreach (雇员类 雇员类的临时对象 in _雇员类泛型实例对象)
{
_委托变量(雇员类的临时对象, (Decimal)0.10);
MessageBox.Show(雇员类的临时对象.Salary.ToString());
}
}
}

public delegate void 委托类型(雇员类 _雇员类实例对象,Decimal 加薪百分比);

public class 雇员类
{
//字段:
private Decimal salary;
//属性:
public Decimal Salary
{
get
{
return salary;
}
}
//构造函数:
public 雇员类(Decimal salary)
{
this.salary = salary;
}
//加薪方法:
public void 加薪方法(Decimal percent)
{
salary *= (1 + percent);
}
}





以上代码的这一句:委托类型 _委托变量 = (委托类型)Delegate.CreateDelegate(typeof(委托类型), mi);

问题是:为什么mi对应的“加薪方法”的参数表(只有一个Decimal类型)和委托类型的参数表(有两个参数)不一致,怎么也可以绑定呢?

求指教。谢谢。
...全文
242 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
abc2363789187 2014-09-15
  • 打赏
  • 举报
回复
引用
所以不要滥用反射。应该使用强类型编程,尽可能避免搞什么诡异的“动态程序”。
学习了。
  • 打赏
  • 举报
回复
不要滥用反射。 反射让你丧失了可靠编程的能力,不会在编译时检查出来错误,只有在运行时、在特定数据条件下才会让你的程序在用户面前崩溃,让开发者丢人现眼。 所以不要滥用反射。应该使用强类型编程,尽可能避免搞什么诡异的“动态程序”。
於黾 2014-09-05
  • 打赏
  • 举报
回复
除非你把委托定义在雇员类里 或者方法是静态方法 否则就必须知道实例啊
showjim 2014-09-05
  • 打赏
  • 举报
回复
加薪方法 是个实例方法,不是静态方法。本来就需要两个参数,一个是this,一个是percent。 如果你要委托绑定一个实例可以这样
public delegate void 委托类型(Decimal 加薪百分比);
委托类型 _委托变量 = (委托类型)Delegate.CreateDelegate(typeof(委托类型), 雇员类的临时对象, mi);
sgyiliya 2014-09-05
  • 打赏
  • 举报
回复
回楼上,我按你的提示,把委托类型的第一个参数删除,编译后执行,提示错误:绑定到目标方法时出错。 咋回事呢?不理解啊。
showjim 2014-09-05
  • 打赏
  • 举报
回复
如果 委托类型 没有第一个参数,那么 加薪方法 的this是什么呢?

110,531

社区成员

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

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

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