关于泛型方法内部获取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方法根据运行时的类型构造出具体的方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值