/// <summary> /// Gets all the extension methods which can match a given name and extending a given Type /// </summary> /// <param name="name">The name.</param> /// <param name="extendedType">The extended type.</param> public static List <IOverloadableMemberDescriptor> GetExtensionMethodsByNameAndType(string name, Type extendedType) { List <UnresolvedGenericMethod> unresolvedGenerics; lock (s_Lock) { unresolvedGenerics = s_UnresolvedGenericsRegistry.Find(name).ToList(); } foreach (var ugm in unresolvedGenerics) { var args = ugm.Method.GetParameters(); if (args.Length == 0) { continue; } var extensionType = args[0].ParameterType; var genericType = GetGenericMatch(extensionType, extendedType); if (ugm.AlreadyAddedTypes.Add(genericType)) { if (genericType != null) { var mi = InstantiateMethodInfo(ugm.Method, extensionType, genericType, extendedType); if (mi != null) { if (!MethodMemberDescriptor.CheckMethodIsCompatible(mi, false)) { continue; } var desc = new MethodMemberDescriptor(mi, ugm.AccessMode); s_Registry.Add(ugm.Method.Name, desc); ++s_ExtensionMethodChangeVersion; } } } } return(s_Registry.Find(name) .Where(d => d.ExtensionMethodType != null && Framework.Do.IsAssignableFrom(d.ExtensionMethodType, extendedType)) .ToList()); }
/// <summary> /// Registers an extension Type (that is a type containing extension methods) /// </summary> /// <param name="type">The type.</param> /// <param name="mode">The InteropAccessMode.</param> public static void RegisterExtensionType(Type type, InteropAccessMode mode = InteropAccessMode.Default) { lock (s_Lock) { bool changesDone = false; foreach (MethodInfo mi in type.GetMethods().Where(_mi => _mi.IsStatic)) { if (mi.GetCustomAttributes(typeof(ExtensionAttribute), false).Length == 0) { continue; } if (mi.ContainsGenericParameters) { s_UnresolvedGenericsRegistry.Add(mi.Name, new UnresolvedGenericMethod(mi, mode)); changesDone = true; continue; } if (!MethodMemberDescriptor.CheckMethodIsCompatible(mi, false)) { continue; } var desc = new MethodMemberDescriptor(mi, mode); s_Registry.Add(mi.Name, desc); changesDone = true; } if (changesDone) { ++s_ExtensionMethodChangeVersion; } } }