Type.InvokeMember 当方法具有字典参数时
本文关键字:字典 参数 InvokeMember 方法 Type | 更新日期: 2023-09-27 18:20:37
我得到了一个
找不到方法 'MyNameSpace.MyClass.MyMethod'。
当我将MyMethod
参数从 Hashtable
更改为 Dictionary<string, string>
时.
调用调用是
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)
你有:
params[5] = foo.myHashtable.Cast<DictionaryEntry>()
.ToDictionary(d => d.Key, d => d.Value);
这将创建一个与签名不匹配的Dictionary<object,object>
。这是因为DictionaryEntry
具有object Key {get;}
和object Value {get;}
,并且编译器正在使用它们来推断字典的类型(泛型类型推断(。
尝试:
params[5] = foo.myHashtable.Cast<DictionaryEntry>()
.ToDictionary(d => (string)d.Key, d => (byte[])d.Value);
这将创建一个Dictionary<string,byte[]>
,它应该匹配。
反射找不到该方法,因为该方法需要哈希表而不是字典,字典不继承自哈希表,因此不能使用字典代替哈希表。方法符号应匹配,然后反射才能调用方法。