转自:http://www.68idc.cn/help/buildlang/ask/20150318283817.html

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

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];

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

最新文章

  1. 从头开始搭建分布式日志平台的docker环境
  2. Object-c字符串操作
  3. webpack +vue开发(3)
  4. Orchard官方文档翻译(十) 管理Widgets
  5. HTML5 对于手机页面长按会粘贴复制的禁用 (解决方案)
  6. android自定义样式大全:shape,selector,layer-list,style,动画全部内容
  7. Reporting Services 2: 参数化报表
  8. thread跟Runnable实现多线程
  9. tableView特色用法
  10. java通用抹去魔,在边界行动,擦除补偿
  11. 【2】Chrome - 快捷键
  12. java实现生产者/消费者的三种方式
  13. 【算法导论】最小生成树之Prime法
  14. 关于ML.NET v0.7的发布说明
  15. SHELL脚本--多命令逻辑执行顺序
  16. EntityFramework 动态构造排序 Func&lt;IQueryable&lt;T&gt;, IOrderedQueryable&lt;T&gt;&gt; Dynamic
  17. 关于Retrofit网络请求URL中含有可变参数的处理
  18. python的常用模块之collections模块
  19. Codeforces Round #371 (Div. 2) B. Filya and Homework 水题
  20. 怎么上传自己的代码/项目到自己的github仓库上

热门文章

  1. oracle细节
  2. C语言回顾-内存管理和指针函数
  3. 堆排序算法 java 实现
  4. c#控制台調用SSIS包互传值
  5. 手机sdk 开发
  6. nodejs的初学
  7. wex5 实战 用户点评与提交设计技巧
  8. angularJS和jQuery的区别
  9. 常用快捷键(WebStorm, Eclipse, Sublime)
  10. libtool: line 990: g++: command not found的解决