gpt4 book ai didi

c# - 尝试创建一个动态委托(delegate)

转载 作者:行者123 更新时间:2023-11-30 12:35:30 24 4
gpt4 key购买 nike

我正在使用 loadfrom 加载一个 dll,并遍历这些方法以找到与签名匹配的方法。当我找到它时,我想将它指定为委托(delegate),以便稍后调用它。这就是我正在做的...

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);
}
}
}

问题是 - 委托(delegate)分配不起作用。我收到绑定(bind)到目标方法的错误。

我在网上读到,如果方法不是静态的,第二个参数可能是问题所在。我的方法不是静态的。

有什么想法吗?

最佳答案

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

首先,Miky 说得对,您必须将实例作为第二个参数传递,但这只是您想要创建所谓的封闭委托(delegate) 时的情况。这意味着实例与方法一起绑定(bind)到委托(delegate)。实际上,这意味着在调用委托(delegate)时,它将始终在同一个实例上操作。

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

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

例子:

MethodInfo toUpperMethod
= typeof( string ).GetMethod( "ToUpper", new Type[] { } );
Func<string, string> toUpper
= (Func<string, string>)Delegate.CreateDelegate(
typeof( Func<string, string> ), toUpperMethod );
string upper = toUpper( "test" ); // Will result in "TEST".

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

关于c# - 尝试创建一个动态委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5383170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com