博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用反射调用方法时,处理ref,out参数需要注意的问题(转)
阅读量:5327 次
发布时间:2019-06-14

本文共 856 字,大约阅读时间需要 2 分钟。

转自:

 

项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现。

public static TR Deserialize<TR>(byte[] source, ref int offset)

一般做法如下:

// 变量 type是该方法所在类型的运行时Type // model是已经定义的实例 MethodInfo genericMethod = type.GetMethod("Deserialize", BindingFlags.Public | BindingFlags.Static); MethodInfo mi = genericMethod.MakeGenericMethod(model.GetType());

反射拿到MethodInfo之后,即可调用方法

// int p // byte[] source // object result result = mi.Invoke(null, new object[]{source, p});

 

回到我们的主题,我们希望方法调用之后,我们传的参数p的值被修改了,事实上,我们会发现,参数p的值并未被改变。

MSDN上面,.net framework 4.5版本中,特别提到了这一点,ref和out参数可能被修改。那我们的问题出在哪里了呢?

问题出在了我们传参数的过程。上面的方法调用,参数被装入数组,由Invoke方法传递给mi指向的方法。我们构造object数组的初始化过程,是值传递的。另一方面,,这个object数组在调用完成后,就被丢掉了。将上述代码改成如下写法:

object[] args = new object[]{source, p}; result = mi.Invoke(null, args); p = (int)args[1];

然后,我们就会发现,被修改的参数,其实在参数数组中好好的放着呢。

转载于:https://www.cnblogs.com/lbhqq/p/5798216.html

你可能感兴趣的文章
正则RegExp
查看>>
跨域的方式总结
查看>>
TIP
查看>>
<转载>PHP的静态变量介绍
查看>>
HTML认识一
查看>>
Activity生命周期
查看>>
MFCC常用类介绍
查看>>
插入排序及使用二分查找优化
查看>>
关于python 输出中文
查看>>
java获取静态页面内容
查看>>
8.信号量
查看>>
22.监视文件
查看>>
算法入门
查看>>
Power Strings POJ - 2406,字符串hash
查看>>
Git发生SSL certificate problem: certificate ha错误的解决方法
查看>>
字符串题目
查看>>
NYOJ458 - 小光棍数
查看>>
java中常用方法
查看>>
【Programming Clip】06、07年清华计算机考研上机试题解答(个别测试用例无法通过)...
查看>>
HTML基础
查看>>