Сбой CreateDelegate из-за несоответствия подписи делегата - PullRequest
0 голосов
/ 19 февраля 2010

Я использую веб-сервис, имеющий несколько методов (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 ]

1 голос
/ 19 февраля 2010

Если вы только пытаетесь вызвать методы в этом месте, я предлагаю вам использовать Type.GetMethod и MethodBase.Invoke вместо прохождения через делегатов. Тогда вы не столкнетесь с этой проблемой.

0 голосов
/ 19 февраля 2010

Сразу после публикации я подумал, что дженерики могут быть ответом, и, действительно, следующее, кажется, помогает ...

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);
    }
}      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...