c# 创建委托 消息订阅_c# – 尝试创建动态委托

我正在使用loadfrom加载一个dll并通过方法迭代以找到与签名匹配的dll.当我找到它时,我想将其指定为委托,以便稍后再调用它.这就是我在做的……

foreach (MethodInfo method in methodInfos)

{

if (method.GetParameters().Length == 2)

{

ParameterInfo[] parameters = method.GetParameters();

if (parameters[0].ParameterType.Name == "Command"

&& parameters[1].ParameterType.Name == "ExposedVariables")

{

aoc.methodinfo = method;

Command.delCmdMethod del = (Command.delCmdMethod)

Delegate.CreateDelegate(typeof(Command.delCmdMethod)

, null

, method);

}

}

}

问题是 – 委托分配不起作用.我得到一个绑定到目标方法的错误.

我在网上看到,如果方法不是静态的,那么第二个参数可能是问题.我的方法不是静态的.

有任何想法吗?

解决方法:

尽管Miky Dinescu的回答可能有所帮助,但它只是部分正确.确实存在Delegate.CreateDelegate的过载,这很可能对您有所帮助.

首先,Miky是正确的,您必须将实例作为第二个参数传递,但只有在您想要创建所谓的已关闭委托时才会出现这种情况.这意味着实例与方法一起绑定到委托.实际上,这意味着在调用委托时,它将始终在同一个实例上运行.

从您的问题来看,这似乎不是您想要实现的目标.如果希望能够在调用委托时传递实例,则必须使用CreateDelegate(Type类型,MethodInfo方法)重载.这允许您创建所谓的开放实例委托.

由于您在调用方法时必须传递实例,这意味着您的委托类型中需要一个额外的参数.委托类型的第一个参数需要与包含该方法的类的类型相对应.

例:

MethodInfo toUpperMethod

= typeof( string ).GetMethod( "ToUpper", new Type[] { } );

Func toUpper

= (Func)Delegate.CreateDelegate(

typeof( Func ), toUpperMethod );

string upper = toUpper( "test" ); // Will result in "TEST".

因为 – 就像你一样 – 我发现这些重载不清楚,我创建了两个辅助函数来清楚地分开创建一个’普通’委托或一个开放实例委托.此代码,以及更彻底的讨论can be found in my blog post.

标签:c,dynamic,winforms,delegates,dll

来源: https://codeday.me/bug/20190704/1381742.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值