当我尝试使用 List<KeyValuePair<string, string>> 作为参数之一调用成员时,Type.InvokeMember 引发 MissingMethod

Posted

技术标签:

【中文标题】当我尝试使用 List<KeyValuePair<string, string>> 作为参数之一调用成员时,Type.InvokeMember 引发 MissingMethodException【英文标题】:Type.InvokeMember throws a MissingMethodException when I try to invoke a member with a List<KeyValuePair<string, string>> as one of the parameters 【发布时间】:2013-03-15 17:55:45 【问题描述】:

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

(我为此使用来自 MSDN 的 DynamicProxy 代码,该代码位于 here)

我在运行时使用 wsdl 创建一个代理,使用以下代码 sn-p -

    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 服务动态创建代理,并在其上执行 type.InvokeMember,我得到一个方法未找到异常。

但是,当我尝试使用所有字符串作为参数调用类似方法时,我可以成功调用该方法。比如下面的方法调用成功

    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;

【问题讨论】:

【参考方案1】:

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

    Dictionary<string, string> 

而不是

    List<KeyValuePair<string,string>> 

它解决了问题。

谢谢

【讨论】:

以上是关于当我尝试使用 List<KeyValuePair<string, string>> 作为参数之一调用成员时,Type.InvokeMember 引发 MissingMethod的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Future<List> 上使用数组方法“折叠”来获取项目的总价格

如何在 Android 中使用 Parcelable 读取 List<List<List<Double>>

当我尝试在 for Each (DART AND FLUTTER) 中使用 .add 时出现问题

List<Model> 不包含定义 SingleOrDefaultAsync 和可访问的扩展方法

Spring中List到Page的转换

如何向 Supplier<List> 添加值