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

时间:2010-02-18 21:16:18

标签: c# reflection delegates

我正在使用一种Web服务,它有许多创建不同对象的方法(50) 例如:
CreateObject1(Object1 obj,int arg2)
CreateObject2(Object2 obj,int arg2)
...
CreateObjectX(ObjectX obj,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);
    }
}   

不幸的是,这给了我一个Failed to Bind异常。 我相信这是因为我的委托签名使用ObjectBase作为其第一个参数,其中函数使用特定的类。

有解决方法吗?

2 个答案:

答案 0 :(得分:1)

如果您尝试在此处调用方法,建议您使用Type.GetMethodMethodBase.Invoke而不是通过委托。那你就不会遇到这个问题。

答案 1 :(得分:0)

发布后,我认为仿制药可能就是答案,事实上以下似乎也可以做到这一点......

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);
    }
}