Gre*_*ner 6 c# reflection reference-parameters
一个很长的标题,但我希望它具体.标题确实是个问题.即使InvokeMember正在调用的方法有一个out参数并且正在为该参数赋值,我也无法获取该值.这是我最初使用的代码:
string parameter = "";
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new object[] { parameter }));
Run Code Online (Sandbox Code Playgroud)
我改变了这个,现在它按预期工作但我不知道为什么:
object[] args = new object[1]; //necessary to retrieve ref/out parameter
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, args));
Run Code Online (Sandbox Code Playgroud)
小智 6
我只是想帮助那些正在努力(我做过)与非托管(COM)并获得ref-parameter的人.因此,当对COM方法使用InvokeMember时,您必须告诉哪些参数是ref-type.这是通过使用ParameterModifier-class实现的,例如:
object[] args = new object[3] { param1, param2, errorStr };
ParameterModifier pMod = new ParameterModifier(3);
pMod[2] = true;
ParameterModifier[] mods = { pMod };
object tempObj = myCOMObject.GetType().InvokeMember("MyCOMMethod", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public, null, myCOMObject, args, mods, null, null);
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,第3个参数被设置为引用(pMod [2] = true;)
你的第二个片段缺少一个相当重要的代码行.它应该看起来像这样,假设out参数是string类型:
object[] args = new object[1]; //necessary to retrieve ref/out parameter
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove,
BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,
null, null, args));
string outValue = (string)args[0]; // <=== here!
Run Code Online (Sandbox Code Playgroud)
现在也应该明白为什么你的第一个片段无法工作,你没有引用你传递的object []数组,所以你永远无法检索修改过的参数.
在您的第一个代码示例中,调用InvokeMember不会修改变量的值parameter,它只是替换参数数组中的第一项(现在指向不同的string实例)。由于您没有保留对此数组的引用,因此您无法检索输出参数的值。
换句话说:数组最初包含parameter变量的副本(即对空字符串的引用的副本)。调用后,parameter数组中的值引用 2 个不同的字符串实例。
| 归档时间: |
|
| 查看次数: |
2852 次 |
| 最近记录: |