代码之家  ›  专栏  ›  技术社区  ›  Nate Heinrich

由于委托签名不匹配,CreateDelegate失败

  •  0
  • Nate Heinrich  · 技术社区  · 15 年前

    我正在使用一个Web服务,它有许多创建不同对象的方法(50)。
    例子:
    创建对象1(对象1对象,int参数2)
    创建对象2(对象2对象,int arg2)

    CreateObjectX(对象x对象,int arg2)

    所有对象(object1、object2、objectx…)都从objectbase继承。

    所以我想这么做…

    delegate void DlgtCreateObject(ObjectBase obj, int arg2);
    
    public void CreateObject(ObjectBase obj, int arg2) 
    {
        DlgtCreateObject dlgt;
        string objType;
        string operation;
    
        objType = obj.GetType().ToString();
        operation = "Create" + objType.Substring(objType.LastIndexOf(".") + 1);
    
        using (MyWebService service = new MyWebService())
        {
    
            dlgt = (DlgtCreateObject)Delegate.CreateDelegate(typeof(DlgtCreateObject),
                                                             service,
                                                             operation,
                                                             false,
                                                             true);
            dlgt(obj, arg2);
        }
    }   
    

    不幸的是,这给了我一个未能绑定的异常。 我相信这是因为我的委托签名使用objectbase作为它的第一个参数,其中函数使用特定的类。

    有办法解决这个问题吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jon Skeet    15 年前

    如果你是 只有 我建议您使用 Type.GetMethod MethodBase.Invoke 而不是通过代表。那你就不会碰到这个问题了。

        2
  •  0
  •   Nate Heinrich    15 年前

    在发帖后,我就想到了仿制药可能是答案,而且实际上,下面的内容似乎起到了关键作用…

    delegate void DlgtCreateObject<T>(T obj, int arg2) where T : ObjectBase;
    
    public void CreateObject<T>(T obj, int arg2) where T : ObjectBase; 
    {
        DlgtCreateObject dlgt;
        string objType;
        string operation;
    
        objType = obj.GetType().ToString();
        operation = "Create" + objType.Substring(objType.LastIndexOf(".") + 1);
    
        using (MyWebService service = new MyWebService())
        {
    
            dlgt = (DlgtCreateObject<T>)Delegate.CreateDelegate(typeof(DlgtCreateObject<T>),
                                                     service,
                                                     operation,
                                                     false,
                                                     true);
            dlgt(obj, arg2);
        }
    }