我有一个构建委托处理程序集合的实现。
public class DelegateHandler
{
internal delegate object delegateMethod(object args);
public IntPtr PublishAsyncMethod(MethodInfo method, MethodInfo callback)
{
RuntimeMethodHandle rt;
try
{
rt = method.MethodHandle;
delegateMethod dMethod = (delegateMethod)Delegate.CreateDelegate
(typeof(delegateMethod), method.ReflectedType, method, true);
AsyncCallback callBack = (AsyncCallback)Delegate.CreateDelegate
(typeof(AsyncCallback), method.ReflectedType, callback, true);
handlers[rt.Value] = new DelegateStruct(dMethod, callBack);
return rt.Value;
}
catch (System.ArgumentException ArgEx)
{
Console.WriteLine("*****: " + ArgEx.Source);
Console.WriteLine("*****: " + ArgEx.InnerException);
Console.WriteLine("*****: " + ArgEx.Message);
}
return new IntPtr(-1);
}
}
我使用以下内容发布:
ptr = DelegateHandler.Io.PublishAsyncMethod(
this.GetType().GetMethod("InitializeComponents"),
this.GetType().GetMethod("Components_Initialized"));
我正在创建一个委托的方法:
public void InitializeComponents(object args)
{
// do stuff;
}
回调方法:
public void Components_Initialized(IAsyncResult iaRes)
{
// do stuff;
}
现在,我已经看过this以了解我可能做错了什么。 CreateDelegate(...)让我收到:
*****: mscorlib
*****:
*****: Error binding to target method.
有什么问题?这些方法驻留在不同的非静态公共类中。任何帮助将不胜感激。
注意:这些方法将包含参数和返回值。据我所知Action
和Action<T>
,这不是一种选择。
答案 0 :(得分:1)
有两个问题。
首先,您将错误的参数传递给CreateDelegate
。由于绑定到实例方法,因此需要传递委托将绑定到的实例,但是您要传递method.ReflectedType
而不是对声明InitializeComponents
和{的类的对象的引用{1}}。
其次,Components_Initialized
的签名与委托InitializeComponents
的声明不符。该代表的回复类型为dMethod
,但object
返回InitializeComponents
。
以下内容应该有效:
void