Вот метод расширения для извлечения Type
интерфейсов, которые конкретный MethodInfo
реализует в своем объявлении Type
:
Во-первых, вспомогательный метод для получения всех карт интерфейса для Type
:
public static IEnumerable<InterfaceMapping> GetAllInterfaceMaps(this Type aType) =>
aType.GetTypeInfo()
.ImplementedInterfaces
.Select(ii => aType.GetInterfaceMap(ii));
Затем метод расширения, который использует помощник для получения интерфейсов для одного метода:
public static Type[] GetInterfacesForMethod(this MethodInfo mi) =>
mi.ReflectedType
.GetAllInterfaceMaps()
.Where(im => im.TargetMethods.Any(tm => tm == mi))
.Select(im => im.InterfaceType)
.ToArray();
Если вам нужны интерфейсы для всех методов класса, вы можете использовать это вместо:
public static ILookup<MethodInfo, Type> GetMethodsForInterfaces(this Type aType) =>
aType.GetAllInterfaceMaps()
.SelectMany(im => im.TargetMethods.Select(tm => new { im.TargetType, im.InterfaceType, tm }))
.ToLookup(imtm => imtm.tm, imtm => imtm.InterfaceType);
Чтобы получить объявления интерфейса, соответствующие методу, вы можете использовать это:
public static IEnumerable<MethodInfo> GetInterfaceDeclarationsForMethod(this MethodInfo mi) =>
mi.ReflectedType
.GetAllInterfaceMaps()
.SelectMany(map => Enumerable.Range(0, map.TargetMethods.Length)
.Where(n => map.TargetMethods[n] == mi)
.Select(n => map.InterfaceMethods[n]));