构建委托处理程序集合

时间:2010-01-09 06:15:23

标签: c# reflection delegates

我有一个构建委托处理程序集合的实现。

   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.

有什么问题?这些方法驻留在不同的非静态公共类中。任何帮助将不胜感激。

注意:这些方法将包含参数和返回值。据我所知ActionAction<T>,这不是一种选择。

1 个答案:

答案 0 :(得分:1)

有两个问题。

首先,您将错误的参数传递给CreateDelegate。由于绑定到实例方法,因此需要传递委托将绑定到的实例,但是您要传递method.ReflectedType而不是对声明InitializeComponents和{的类的对象的引用{1}}。

其次,Components_Initialized的签名与委托InitializeComponents的声明不符。该代表的回复类型为dMethod,但object返回InitializeComponents

以下内容应该有效:

void