posts - 165,  comments - 880,  trackbacks - 42
由于该方法是针对自需求编写的,所以不一定适合你的需要,但对于想学习的朋友可以作一个参考.
 private void MethodGenerator(ILGenerator il, MethodInfo method)
        
{
  
            Type[] types 
= GetParameterTypes(method.GetParameters());
            Type[] gtypes;
            MethodInfo callmethod;
            il.DeclareLocal(
typeof(MethodBase));
            il.DeclareLocal(
typeof(object[]));
            
bool isvoid = method.ReturnType.ToString() == "System.Void";
            
if (!isvoid)//定义返回值变量
            {
                il.DeclareLocal(GetType(method.ReturnType));
                
            }

            il.DeclareLocal(
typeof(object[]));
            il.DeclareLocal(
typeof(Type[]));
            il.Emit(OpCodes.Nop);
            callmethod 
= typeof(MethodBase).GetMethod("GetCurrentMethod"new Type[0]);
            il.Emit(OpCodes.Call, callmethod);
            il.Emit(OpCodes.Stloc_0);
//把调用GetCurrentMethod的返回值封送到局部变量0里
            AddGenericTypes
            
if (types.Length > 0)//存在方法参数
            {
                il.Emit(OpCodes.Ldc_I4, types.Length);
//加载数组长度
                il.Emit(OpCodes.Newarr, typeof(object));//定义数组,并保存以下局部变量中
                if (!isvoid)
                   il.Emit(OpCodes.Stloc_3);
                
                
else
                   il.Emit(OpCodes.Stloc_2);
                
                
for (int i = 0; i < types.Length; i++)//将参数加载到局部变量数组里面
                {
                    
if (!isvoid)
                        il.Emit(OpCodes.Ldloc_3);
                    
else
                        il.Emit(OpCodes.Ldloc_2);
                    il.Emit(OpCodes.Ldc_I4, i);
                    il.Emit(OpCodes.Ldarg, i 
+ 1);
                    
if (types[i].IsValueType || types[i].IsGenericParameter || types[i].IsGenericType)
                    
{
                        
//是值类型,泛型参,泛型拖进来打包装箱
                        il.Emit(OpCodes.Box, GetType(types[i]));
                    }

                    il.Emit(OpCodes.Stelem_Ref);
                    
                }



                
if (!isvoid)//加载相关局部变量
                    il.Emit(OpCodes.Ldloc_3);

                
else
                    il.Emit(OpCodes.Ldloc_2);

                
            }

            
else
            
{
                il.Emit(OpCodes.Ldnull);
            }

           
            il.Emit(OpCodes.Stloc_1);
            il.Emit(OpCodes.Ldloc_0);
//加载method类型变量
            if (!isvoid)//加载泛型类型数组变量
                il.Emit(OpCodes.Ldloc_S, 4);
            
else
                il.Emit(OpCodes.Ldloc_3);
            il.Emit(OpCodes.Ldloc_1);
//加载参数数组变量
            callmethod = typeof(Context).GetMethod("CallMethod"new Type[] typeof(MethodBase),typeof(Type[]), typeof(object[]) });
            il.Emit(OpCodes.Call, callmethod);
//把方法参数和相关信息扔到一个上下文方法处理
            if (!isvoid)
            
{
                
if (method.ReturnType.IsValueType || method.ReturnType.IsGenericType|| method.ReturnType.IsGenericParameter)
                
{
                        
//是值类型,泛型参,泛型拖进来脱衣服
                        il.Emit(OpCodes.Unbox_Any,GetType(method.ReturnType));
                   
                }

                
else
                
{
                    il.Emit(OpCodes.Castclass, method.ReturnType);
                }

                il.Emit(OpCodes.Stloc_2);

                il.Emit(OpCodes.Ldloc_2);
            }

            
else
            
{
                il.Emit(OpCodes.Pop);
            }

            il.Emit(OpCodes.Ret);
            
            
        }
posted on 2008-05-22 09:11 henry 阅读(226) 评论(3)  编辑 收藏 所属分类: Emit

FeedBack:
2008-05-23 10:19 | 装配脑袋      
if (method.ReturnType.IsValueType || method.ReturnType.IsGenericType|| method.ReturnType.IsGenericParameter)


为什么IsGenericType也要unbox呢?
  回复  引用  查看    
#2楼 [楼主]
2008-05-23 11:47 | henry      
@装配脑袋
按理应该不需要因为IsGenericType的最终类型不可能是值类型...
由于自己对IL掌握还不是很全面,有些东西只能看ildasm推出来.
不过以上代码在测过GenericType返回值的确没有问题,请指点一下:)
  回复  引用  查看    
2008-05-26 09:14 | 装配脑袋      
实际上unbox.any似乎对任何类型都没有问题……
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-22 10:17 编辑过


相关链接:
 


<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

寻求伯乐,限广州地区有意联系


与我联系

搜索

 

常用链接

留言簿(21)

我参加的小组

我的标签

随笔分类

最新评论