您的位置:首页 > 其它

B\S备忘录21——使用反射将委托挂钩

2015-06-30 20:19 190 查看
  上上篇博客,写了我用反射实现动态配置业务的过程,其中有一个方法是关键点,CreateDelegate。

  以前使用委托的时候都是使用把方法绑定给委托的方式,来使用。这次是需要使用MethodInfo这个类型来绑定委托,查的资料还是MSDN比较详细。

  这个CreateDelegate一共有。。。好多个重载,我用的只是其中一种:使用指定的对象创建指定类型的委托,该委托表示指定的方法。

  这里我是用的是MSDN上的第二个重载,Delegate.CreateDelegate(Type,Object,MethodInfo),三个参数分别是,要创建的委托的类型

public delegate void Caller();

public static void Demo()
{
//获得MyMethod方法信息
MethodInfo minfo = typeof(Derived).GetMethod("MyMethod");
//创建委托并且绑定到Caller委托类型的对象上
Caller ex =(Caller)Delegate.CreateDelegate(typeof(Caller),null, minfo);
}
  这样就创建成功一个委托,并且不需要知道MyMethod方法的具体信息。要是通过反射来获得MethodInfo的话,上上篇博客中已经写到了,这里就不再写一遍了。

  如果是正常情况下,我这种创建委托的方式,CreateDelegate的第二个参数可以不写的,本身我们就有一个委托的对象来接受创建出来的委托,并不需要null这个参数先绑定一个空值,再绑定到ex对象上,这样的效率反而低了。但是我在工作流系统中出现了一个错误。

  无法绑定到目标方法,因其签名或安全透明度与委托类型的签名或安全透明度不兼容。

  后来解决这个问题就是写成现在这个样子,我后来找到了原因,委托类型的声明,与创建委托的过程,这两段代码是在两个系统中写的,所以出现了签名不一致的情况,网上给出的解决方案是这样的。

  在“解决方案资源管理器”中选定一个项目,然后在“项目”菜单中单击“属性”。
  在“项目设计器”中,单击“安全”选项卡。
  选择“启用 ClickOnce安全设置”复选框,然后单击“这是不完全可信的应用程序”选项按钮。
  单击“高级”按钮。
  选择“使用选定权限集调试此应用程序”复选框,然后单击“确定”。
  但是我这里并没有找到安全选项卡,所以就只能用这样的低效率方案了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: