关于泛型方法内部获取CurrentMethodInfo迷惑

      前段时间在写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  阅读(1806)  评论(1编辑  收藏  举报

导航