2 回答
TA贡献1998条经验 获得超6个赞
您似乎想要对可以从GetInterfaceMap获得的信息进行反向查找。构建它非常简单,
public static Dictionary<MethodInfo, List<(Type, MethodInfo)>> GetReverseInterfaceMap(Type t)
{
var reverseMap = new Dictionary<MethodInfo, List<(Type, MethodInfo)>>();
var maps = t.GetInterfaces().ToDictionary(i => i, i => t.GetInterfaceMap(i));
foreach (var m in t.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
{
var list = new List<(Type, MethodInfo)>();
foreach (var (i, map) in maps)
{
for (int index = 0; index < map.TargetMethods.Length; index++)
{
var targetMethod = map.TargetMethods[index];
if (targetMethod == m)
{
list.Add((map.InterfaceType, map.InterfaceMethods[index]));
break;
}
}
}
reverseMap[m] = list;
}
return reverseMap;
}
关于界面的工作方式,有几点要说明,因为画面并不像“派生”->“基础”->“界面”那样简单。有一个映射描述了每个接口方法调用的具体方法。该信息很容易获得,因为运行时需要它来实现接口调度。然而,相反的过程并不那么简单。一种具体方法可能是多个接口的映射。接口方法也可能被派生类重新映射。这一切都需要考虑在内。
- 2 回答
- 0 关注
- 182 浏览
添加回答
举报