利用反射调用方法时,处理ref,out参数需要注意的问题
2015-03-18 12:31
411 查看
项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现。
一般做法如下:
反射拿到MethodInfo之后,即可调用方法
注意这里的调用方法传的参数,形参offset并没有像直接调用方法那样指定ref修饰符,像ref,out这样的参数修饰符在利用反射调用方法时是不需要指定的。
回到我们的主题,我们希望方法调用之后,我们传的参数p的值被修改了,事实上,我们会发现,参数p的值并未被改变。
MSDN上面,.net
framework 4.5版本中,特别提到了这一点,ref和out参数可能被修改。那我们的问题出在哪里了呢?
问题出在了我们传参数的过程。上面的方法调用,参数被装入数组,由Invoke方法传递给mi指向的方法。我们构造object数组的初始化过程,是值传递的。另一方面,这个object数组在调用完成后,就被丢掉了。将上述代码改成如下写法:
然后,我们就会发现,被修改的参数,其实在参数数组中好好的放着呢。
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});
注意这里的调用方法传的参数,形参offset并没有像直接调用方法那样指定ref修饰符,像ref,out这样的参数修饰符在利用反射调用方法时是不需要指定的。
回到我们的主题,我们希望方法调用之后,我们传的参数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];
然后,我们就会发现,被修改的参数,其实在参数数组中好好的放着呢。
相关文章推荐
- 利用反射调用方法时,处理ref,out参数需要注意的问题(转)
- .NET/C#利用反射调用含ref或out参数的方法示例代码
- C#中ref和out参数使用时需要注意的问题
- c# - 外部对象作为参数调用方法时需要注意的问题
- c#中ref和out参数使用时需要注意的问题
- C#如何通过反射调用带有ref或者out的参数的方法
- 返回多个不同类型参数的值(out)可变参数一维数组( params )把值从方法中带出(ref) 方法递归(方法自己调用自己与循坏类似注意return每次只能跳出一个方法))
- 如何通过反射调用带有ref或者out的参数的方法[迁移]
- c#中ref和out参数使用时需要注意的问题_百度文库
- 一个内部类定义在外部类方法中的的例子(调用参数的时候需要注意final来修饰)
- Java中通过反射调用其他类中的main方法时要注意的问题
- 【PHP小错误整理】在类面调用自定义方法需要注意的问题
- java中用反射调用其他类的main方法时应注意的问题
- 用反射调用方法(带自定义类型的参数)问题
- PHP中通过调用call_user_func_array函数执行mysqli_stmt_bind_param方法时需要注意的问题
- c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别
- 方法参数ref,out的问题!
- 黑马程序员—反射调用main方法的问题总结(涉及可变参数)(反射参数是一个数组的函数要小心)
- 黑马程序员—反射调用main方法的问题总结(涉及可变参数)
- 【C#基础】方法及其调用、构造方法、out与ref参数及其返回值、方法重载、静态方法等简单介绍