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<string, string> toUpper
    = (Func<string, string>)Delegate.CreateDelegate(
          typeof( Func<string, string> ), toUpperMethod );
string upper = toUpper( "test" ); // Will result in "TEST".

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

点赞