У меня есть реализация, создающая коллекцию обработчиков делегатов.Создание коллекции обработчиков делегатов
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;
}
Теперь я тоже посмотрел t this, чтобы понять, что я могу делать неправильно. CreateDelegate (...) вызывает у меня:
*****: mscorlib
*****:
*****: Error binding to target method.
Что не так? Методы находятся в другом нестационарном публичном классе. Любая помощь будет принята с благодарностью.
ПРИМЕЧАНИЕ. Эти методы будут иметь параметры и возвращаемые значения. Как я понимаю, Action
и Action<T>
, это не было бы выбором.
Во-первых, спасибо за ваш ответ. Потрясающие!!! Подпись для 'delegateMethod' с типом возврата была надзором в сообщении. Я упростил все это и просто забыл это показать. Однако это определенно то, что мне нужно. Я уверен, что на самом деле я пытался передать целевой объект, тем не менее, на этот раз у нас все в порядке. Еще раз спасибо... – IAbstract