Type.InvokeMember 当方法具有 Dictionary 参数时

Posted

技术标签:

【中文标题】Type.InvokeMember 当方法具有 Dictionary 参数时【英文标题】:Type.InvokeMember when method has a Dictionary parameter 【发布时间】:2013-07-01 09:43:04 【问题描述】:

我得到了一个

找不到方法“MyNameSpace.MyClass.MyMethod”。

当我将MyMethod 的参数从Hashtable 更改为Dictionary<string, string>

invoke 调用是

return = t.InvokeMember("MyMethod", (BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod), null, instance, params);

当我这样做时

Type type = a.GetType(String.Concat(DLLName, ".MyClass"));
var methods = t.GetMethods();

methods 包含 MyMethod() 所以它就在那里。

谁能解释一下?

params

Object[] params = new Object[11];
...
params[5] = foo.myHashtable.Cast<DictionaryEntry>().ToDictionary(d => d.Key, d => d.Value);   
...

MyMethod 签名是

public MyMethodReturn MyMethod(Byte[] m, Hashtable d, Mutex mut, FileStream logFile, Hashtable t, Dictionary<string, Byte[]> fields, bool e, byte[] k, int hashCode, bool h, Byte[] mm)

【问题讨论】:

foo.myHashtable.Cast&lt;DictionaryEntry&gt;().ToDictionary(d =&gt; d.Key, d =&gt; d.Value); 实际上并没有把字典放在任何地方——它只是把它放在地板上让垃圾收集器处理;您是否将其分配给变量或任何东西?更好:您能否显示 actually 使用您的输入调用 InvokeMemberactual 代码?最好是MyMethod实际 签名(因为我担心... 中可能隐藏着什么) 我没有正确复制和粘贴。已编辑。好的。 【参考方案1】:

你有:

params[5] = foo.myHashtable.Cast<DictionaryEntry>()
               .ToDictionary(d => d.Key, d => d.Value); 

这会创建一个与签名不匹配的Dictionary&lt;object,object&gt;。这是因为DictionaryEntry 具有object Key get;object Value get;,编译器使用它们来推断字典的类型(通用类型推断)。

试试:

params[5] = foo.myHashtable.Cast<DictionaryEntry>()
               .ToDictionary(d => (string)d.Key, d => (byte[])d.Value); 

这将创建一个Dictionary&lt;string,byte[]&gt;,它应该匹配。

【讨论】:

【参考方案2】:

反射找不到该方法,因为该方法需要一个哈希表而不是字典,字典不继承自哈希表,因此您不能使用字典代替哈希表。在反射可以调用方法之前,方法签名应该匹配。

【讨论】:

来自问题:“MyMethod 签名是public MyMethodReturn MyMethod(... Dictionary&lt;string, Byte[]&gt; fields ...)” - 对我来说就像一本字典...... 是的,抱歉没注意到

以上是关于Type.InvokeMember 当方法具有 Dictionary 参数时的主要内容,如果未能解决你的问题,请参考以下文章

DotNet中Type.InvokeMember用法

似乎 Type.InvokeMember 不适用于 short、int16 或其他 16 位数字类型的类

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

动态创建对象

当类型参数具有公共类型时,Scala添加扩展方法

当方法包含多个具有多个返回的 if 语句时,如何从方法中获取返回值?