关于泛型方法内部获取CurrentMethodInfo迷惑
假设有以下一个泛型方法
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方法根据运行时的类型构造出具体的方法.