2013-07-01 81 views
2

我得到一个Type.InvokeMember时方法有一个字典参数

方法。

当我改变的MyMethod一个参数从HashtableDictionary<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) 
+0

'foo.myHashtable.Cast ()。ToDictionary(d => d.Key,d => d.Value);'实际上并没有将字典放到任何地方 - 它只是将它放在地板上垃圾收集器来处理;你把这个分配给一个变量或任何东西?更好:你可以显示*实际*代码*实际*调用'InvokeMember'你的输入?最好是MyMethod的* actual *签名(因为我担心可能潜伏在'...'中) –

+0

我没有正确复制和粘贴。编辑。好的。 –

回答

1

您有:

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

这将创建一个Dictionary<object,object>,不签名匹配。这是因为DictionaryEntryobject Key {get;}object Value {get;},编译器正在使用这些来推断字典的类型(泛型类型推断)。

尝试:

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

这将创建一个Dictionary<string,byte[]>,这应该匹配。

+0

完美。谢谢。 –

0

反射找不到方法,因为该方法需要一个哈希表不是词典],字典不从哈希表继承等等你不能使用字典而不是散列表。在反射可以调用方法之前,方法签名应匹配。

+0

从问题:“MyMethod签名是公共MyMethodReturn MyMethod(...字典<字符串,字节[]>字段...)'” - 看起来像一个字典给我... –

+0

是的,对不起注意它 –

+0

尝试先获取方法,然后调用它。 Type.GetMethod ... –

相关问题