我正在使用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.