private static void DiscoverAllGenericMethodsOfInterfacesForMethod(IEnumerable <IType> allTypes, ISet <IMethod> genericMethodSpecializations, IGrouping <IType, IMethod> specializedTypeMethods) { var types = allTypes.Where(t => t.GetAllInterfaces().Contains(specializedTypeMethods.Key)).ToList(); foreach (var specializedTypeMethod in specializedTypeMethods) { var flags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance; foreach (var genericMethodOfInterface in types.SelectMany(t => t.GetMethods(flags).Where(m => m.IsGenericMethodDefinition && m.IsMatchingOverride(specializedTypeMethod)))) { genericMethodSpecializations.Add( genericMethodOfInterface.ToSpecialization(MetadataGenericContext.CreateMap(genericMethodOfInterface, specializedTypeMethod))); } } }
/// <summary> /// </summary> /// <param name="allTypes"> /// </param> /// <param name="genericMethodSpecializations"> /// </param> private static void DiscoverAllGenericVirtualMethods(IEnumerable <IType> allTypes, ISet <IMethod> genericMethodSpecializations) { // find all override of generic methods var flags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance; var overrideSpecializedMethods = new List <IMethod>(); foreach (var overrideGenericMethod in allTypes.SelectMany(t => t.GetMethods(flags).Where(m => m.IsOverride && m.IsGenericMethodDefinition))) { var method = overrideGenericMethod; var genericMethod = overrideGenericMethod; overrideSpecializedMethods.AddRange( from specializationMethod in genericMethodSpecializations.Where(m => m.IsVirtual || m.IsOverride || m.IsAbstract) where method.DeclaringType.IsDerivedFrom(specializationMethod.DeclaringType) && method.IsMatchingOverride(specializationMethod) select genericMethod.ToSpecialization(MetadataGenericContext.CreateMap(genericMethod, specializationMethod))); } // append to discovered foreach (var overrideSpecializedMethod in overrideSpecializedMethods) { genericMethodSpecializations.Add(overrideSpecializedMethod); } }