含有ref out 参数 的方法反射 Emit 与 普通
2015-06-08 17:08
711 查看
反射中很多朋友应该屡屡被带有ref out参数的方法折腾
当使用正常反射一个方法时候:
代码如下调用一个后期绑定方法MakeByRefType 就行了
当使用Emit 动态创建方法 这个方法还需要反射其他方法时候:
比正常方式麻烦一点的是 .NET 会将类型修改为 XXX& 比如 int&
首先你还是要以正常的方式创建 Type[] 判断类型名包含 & 先以 XXX 类型
OpCodes.Ldtoken 是无法获取到 ref out 参数的 元数据标记的运行时表示形态
先以除去& 的类型获取后
在调用Type.MakeByRefType() 方法
![](http://images2015.cnblogs.com/blog/399630/201603/399630-20160316213403115-1078796638.png)
当使用正常反射一个方法时候:
代码如下调用一个后期绑定方法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 = 0; 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[]) })); .......
![](http://images2015.cnblogs.com/blog/399630/201603/399630-20160316213403115-1078796638.png)
相关文章推荐
- 产品知识管理:最笨的方法或许也是最好的
- java包装类
- 在jquery的ajax中添加自定义的header信息
- 必备的SAT写作高频固定搭配总结
- (ML foundation 7)VC dimension & Model complexity
- 六 100万并发连接服务器笔记之Erlang完成1M并发连接目标
- android学习收藏的一些网址,自用~
- linux shell 自定义函数(定义、返回值、变量作用域)介绍
- win7下安装及验证jdk
- (ML Foundation 8)Error measure
- C# using
- Android实现语音识别代码
- android 背景图片的变形(background)
- 项目管理系列分享(六)——最佳实践-需求
- 三 100万并发连接服务器笔记之测试端就绪
- 四 100万并发连接服务器笔记之1M并发连接目标达成
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- iOS AVCaptureVideoDataOutputSampleBufferDelegate 录制视频
- CF149D 区间dp
- IOS(CGGeometry)几何类方法总结