当我尝试使用 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 时出现问题