不要让写程序变成一种负担

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  162 Posts :: 0 Stories :: 832 Comments :: 31 Trackbacks
      前段时间在写IL实现接口时遇到一个很迷惑的事情,就是无论以什么类型调用泛型方法其内部得到的CurrentMethodInfo都是一样,并不有带任何明确类型的信息;最后在没办法的情况我只好修改的IL的实现.下面分析一下发生的问题和解决我使用的解决方法.

假设有以下一个泛型方法

    public IList<T> ListData<T>(T name)

    {

        MethodInfo mi = (MethodInfo)MethodInfo.GetCurrentMethod();

        return null;

       

    }

无认以ListData<String>,ListData<Int>或其他方式调用也好, GetCurrentMethod得到的都是没有确定确定的MethodInfo.

{System.Collections.Generic.IList`1[T] ListData[T](T)}

按我的理解得到的应该是对.

{System.Collections.Generic.IList`1[string] ListData[string](string)}

{System.Collections.Generic.IList`1[int] ListData[int](int)}

即使调用GetGenericArguments得到的类型描述还是T,不知道是不是我对泛型的理解有问题最后在没办法的情况下只好选择修改IL方法

代码大概这样

            if (method.IsGenericMethod)//当然泛型方法

            {

                gtypes = method.GetGenericArguments();

                il.Emit(OpCodes.Ldc_I4, gtypes.Length);//加载数组长度

                il.Emit(OpCodes.Newarr, typeof(Type));//定义数组,并保存以下局部变量中

                if (!isvoid)

                    il.Emit(OpCodes.Stloc_S, 4);

                else

                    il.Emit(OpCodes.Stloc_3);

                for (int i = 0; i < gtypes.Length; i++)//初始化泛型类型

                {

                    if (!isvoid)//加载相关局部变量

                        il.Emit(OpCodes.Ldloc_S, 4);

                    else

                        il.Emit(OpCodes.Ldloc_3);

                    il.Emit(OpCodes.Ldc_I4, i);//设置索引

                    il.Emit(OpCodes.Ldtoken, gtypes[i]);//封送类型

                    callmethod = typeof(Type).GetMethod("GetTypeFromHandle"

                        , new Type[] {typeof(RuntimeTypeHandle)});

                    il.Emit(OpCodes.Call, callmethod);//调用GetTypeFromHandle方法获取运行时类型

                    il.Emit(OpCodes.Stelem_Ref);//保存到数组

                }

            }

通过Ldtoke指令得到运行时类型保存数组件,最后通过MakeGenericMethod方法根据运行时的类型构造出具体的方法.

posted on 2008-05-16 13:07 henry 阅读(1135) 评论(1)  编辑 收藏 所属分类: Emit

Feedback

#1楼  2008-05-16 17:07 Anders06      
关注下
  回复  引用  查看    


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