含有ref out 参数 的方法反射 Emit 与 普通
反射中很多朋友应该屡屡被带有ref out参数的方法折腾
当使用正常反射一个方法时候:
代码如下调用一个后期绑定方法MakeByRefType 就行了
MemberInfo test = typeof(Type).GetMethod("MemberName", new Type[] { typeof(int), typeof(int).MakeByRefType()});
当使用Emit 动态创建方法 这个方法还需要反射其他方法时候:
比正常方式麻烦一点的是 .NET 会将类型修改为 XXX& 比如 int&
首先你还是要以正常的方式创建 Type[] 判断类型名包含 & 先以 XXX 类型
OpCodes.Ldtoken 是无法获取到 ref out 参数的 元数据标记的运行时表示形态
先以除去& 的类型获取后
在调用Type.MakeByRefType() 方法
....
var methodInfoLocal = generator.DeclareLocal(typeof(System.Reflection.MethodInfo));
var preAspectLocal = generator.DeclareLocal(typeof(PreAspectAttribute));
var Typeparmeter = generator.DeclareLocal(typeof(Type[])); generator.Emit(OpCodes.Ldc_I4, parameterInfos.Length);
generator.Emit(OpCodes.Newarr, typeof(Type));
generator.Emit(OpCodes.Stloc, Typeparmeter); for ( int i = ; i < parameterInfos.Length; i++ )
{
generator.Emit(OpCodes.Ldloc, Typeparmeter);
generator.Emit(OpCodes.Ldc_I4, i);
if ( parameterInfos[i].ParameterType.Name.Contains("&") )
{
string typstr = parameterInfos[i].ParameterType.FullName.Replace("&", "");
Type typetem = Type.GetType(typstr);
generator.Emit(OpCodes.Ldtoken, typetem);
}
else
{
generator.Emit(OpCodes.Ldtoken, parameterInfos[i].ParameterType);
} generator.Emit(OpCodes.Call, typeof(System.Type).GetMethod("GetTypeFromHandle", new Type[] { typeof(System.RuntimeTypeHandle) }));
if ( parameterInfos[i].ParameterType.Name.Contains("&") )
{
generator.Emit(OpCodes.Callvirt, typeof(System.Type).GetMethod("MakeByRefType"));
}
generator.Emit(OpCodes.Stelem_Ref);
}
generator.Emit(OpCodes.Ldarg_0);
//构造中实例化的对象
generator.Emit(OpCodes.Ldfld, _realProxyField); generator.Emit(OpCodes.Callvirt, typeof(System.Object).GetMethod("GetType", BindingFlags.Public | BindingFlags.Instance)); generator.Emit(OpCodes.Ldstr, methodName);
generator.Emit(OpCodes.Ldloc, Typeparmeter); generator.Emit(OpCodes.Callvirt, typeof(System.Type).GetMethod("GetMethod", new Type[] { typeof(string),typeof(Type[]) })); .......
含有ref out 参数 的方法反射 Emit 与 普通的更多相关文章
- C#如何通过反射调用带有ref或者out的参数的方法
写这篇博客,原起今天CyljXu问我一个问题:如何通过反射调用带有ref或者out的参数的方法?想着可能其他人也会遇到这个问题,权且记录下来,以备后行者搜索到. 这个在MSDN上有解释,参考 Meth ...
- 3、二、c# 面向对像编程。类,结构、C# 数据类型(引用类型、值 类型、指针类型)、ref参数与out参数、方法的重载、静态类型与静态成员、继承与多态、委托与事件
一.类 定义类使用class关键字. <access specifier> class class_name { // member variables 成员变量 <access s ...
- C#中引用类型的变量做为参数在方法调用时加不加 ref 关键字的不同之处
一直以为对于引用类型做为参数在方法调用时加不加 ref 关键字是没有区别的.但是今天一调试踪了一下变量内存情况才发现大有不同. 直接上代码,结论是:以下代码是使用了 ref 关键字的版本.它输出1 ...
- 反射-Emit
一.Emit Emit,可以称为发出或者产出.在Framework中,与Emit相关的类基本都存在与System.Reflection,Emit命名空间下.可见Emit是作为反射的一个元素存在,反射可 ...
- pyqt4:连接的一个带有参数的方法
一般在pyqt4中的信号连接很少连接带参数的方法,很多时候连接带参数的方法节约不少代码量. self.s5_thread=scene.Worker5() self.log_get=QtCore.QTi ...
- 使用jquery获取url以及jquery获取url参数的方法
使用jquery获取url以及使用jquery获取url参数是我们经常要用到的操作 1.jquery获取url很简单,代码如下 1.window.location.href; 其实只是用到了javas ...
- 使用jquery获取url及url参数的方法及定义JQuery扩展方法
1.jquery获取url很简单,代码如下: window.location.href; 其实只是用到了javascript的基础的window对象,并没有用jquery的知识. 2.jquery获取 ...
- [开发笔记]-使用jquery获取url及url参数的方法
使用jquery获取url以及使用jquery获取url参数是我们经常要用到的操作 1.jquery获取url很简单,代码如下: window.location.href; 其实只是用到了javasc ...
- Java--获取request中所有参数的方法
我们通常用到request获取某个参数的方法: String value=request.getparameter("key"); 如果想要获取request中所有的参数呢? re ...
随机推荐
- python的/和//运算
#谁能告诉我这个框框怎么去掉!!! python中"/"操作为除法操作,"//"操作为整数除操作,具体差异如下 " / "表示 浮点数除法, ...
- 【刷题】BZOJ 2154 Crash的数字表格
Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如 ...
- 【BZOJ2813】奇妙的Fibonacci
Description Fibonacci数列是这样一个数列: F1 = 1, F2 = 1, F3 = 2 . . . Fi = Fi-1 + Fi-2 (当 i >= 3) pty忽 ...
- C++运算符重载形式——成员函数or友元函数
运算符重载是C++多态的重要实现手段之一.通过运算符重载对运算符功能进行特殊定制,使其支持特定类型对象的运算,执行特定的功能,增强C++的扩展功能. 运算符重载的我们需要坚持四项基本原则: (1)不可 ...
- Java之NIO,BIO,AIO
Hollis知识星球的一些学习笔记,有兴趣的朋友可以微信搜一下 什么是NIO 什么是IO? 它是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 ...
- substring()方法到底做了什么?不同版本的JDK中是否有区别?为什么?
该文章是图说Java系列文章中的一篇 substring(int beginIndex, int endIndex)方法在jdk 6和jdk 7中的实现是不同的.了解他们的区别可以帮助你更好的使用 ...
- 《剑指offer》— JavaScript(16)合并两个排序的链表
合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. *** 思路 如果pHead1和pHead2中有一个为空,则result是另 ...
- 交互式shell脚本对话框----whiptail指令
当你在linux环境下setup软件的时候就会有相应的对话框让你输入.虽然我们已经习惯了这种交互的方法,但是如果有一种直观的界面来输入是不是会更加友好和方便呢,在shell脚本中你可以使用-whipt ...
- webpack+vue+iview使用vue-cli脚手架搭建
1.安装nodejs环境 下载node.js.安装成功后再控制台输入 node -v 出现版本号则,安装成功. 如果没有出现 版本号 而是出现node 不是内部命令的话 需要配置一下环境变量,如果已经 ...
- 转:RAC中比较replay, replayLast, and replayLazily
A co-worker recently asked me about the difference between -replay, -replayLast, and -replayLazily i ...