Type.InvokeMember在我尝试调用一个成员时抛出一个MissingMethodException,<KeyValuePair<string>>作为参数之一



我正在尝试使用WCF web服务的WSDL动态创建代理,并在其上调用方法。我试图通过在运行时构造代理来调用WCF服务中的方法签名如下:

(我使用来自MSDN的DynamicProxy代码用于此目的,位于此处)

我在运行时使用wsdl创建代理,使用以下代码片段-

    var factory = new DynamicProxyFactory(wsdl);
    var proxy = factory.CreateProxy(contract);
    object value1 = topic;
    object value2 = emailMessage;
    object value3 = messageProperties; //This is of type List<KeyValuepair<string,string>>
     proxy.CallMethod(method, value1, value2, value3);

上面调用的方法具有如下所列的签名:

    void ReceiveMessage(string topic, string message, List<KeyValuePair<string, string>> propertyBag);

一旦我动态地为包含上述方法的web服务创建一个代理,并执行一个类型。在它上面,我得到一个方法没有发现异常。

然而,当我尝试调用一个类似的方法,所有字符串作为参数时,我可以成功调用该方法。例如,成功调用了以下方法

    void ReceiveMessage2(string message, string topic, string anything);

我使用InvokeMember的方式非常简单

    public object CallMethod(string method, params object[] parameters)
    {
        object retval = this.objType.InvokeMember(
            method,
            BindingFlags.InvokeMethod | CommonBindingFlags,
            null /* Binder */,
            this.obj,
            parameters /* args */);
        return retval;
    }

有人能帮我弄清楚我做错了什么吗?我对两个调用(ReceiveMessage和ReceiveMessage2)都以相同的方式传递对象。提前感谢。这件事快把我逼疯了。

编辑:

上面函数中的commonBindingFlags实际上是这个

的包装器。
     BindingFlags.Instance | BindingFlags.Public;

我找到了解决问题的方法。看起来KeyValuePair是不可序列化的。我用

    Dictionary<string, string> 

代替

    List<KeyValuePair<string,string>> 

,它解决了问题。

谢谢

相关内容

最新更新