public T[] RemoveOverriddenMembers <T> (IEnumerable <T> members) where T : MemberInfo { ArgumentUtility.CheckNotNull("members", members); // maps the associated methods' base definitions to the most derived member in the list; we adjust this dictionary as we walk the members var baseDefinitionsToMostDerivedMembers = new Dictionary <MethodInfo, T> (); foreach (var member in members) { var associatedMethodsForMember = ReflectionUtility.GetAssociatedMethods(member); foreach (var associatedMethodForMember in associatedMethodsForMember) { // check whether we already have a member for that base definition; if yes, check which one is more derived var baseDefinition = MethodBaseDefinitionCache.GetBaseDefinition(associatedMethodForMember); T existingMember; if (!baseDefinitionsToMostDerivedMembers.TryGetValue(baseDefinition, out existingMember) || // we have no member for the base definition... existingMember.DeclaringType.IsAssignableFrom(member.DeclaringType)) // the current one is more derived... { baseDefinitionsToMostDerivedMembers[baseDefinition] = member; // ...so store the current member } } } return(baseDefinitionsToMostDerivedMembers.Values.Distinct().ToArray()); // Distinct required for members that have more than one accessor }
private MethodInfo ImplementBaseCallMethod(MethodInfo baseMethod) { Assertion.IsTrue(ReflectionUtility.IsPublicOrProtected(baseMethod)); if (baseMethod.IsAbstract) { var message = string.Format("The given method {0}.{1} is abstract.", baseMethod.DeclaringType.FullName, baseMethod.Name); throw new ArgumentException(message, "baseMethod"); } var attributes = MethodAttributes.Public | MethodAttributes.HideBySig; var name = "__base__" + baseMethod.Name; var md = MethodDeclaration.CreateEquivalent(baseMethod); return(_concreteTarget.AddMethod(name, attributes, md, ctx => ctx.DelegateToBase(baseMethod))); }
public void Apply(Type type) { IEnumerable <MethodInfo> methods = ReflectionUtility.RecursiveGetAllMethods(type, c_bindingFlags); IEnumerable <PropertyInfo> properties = ReflectionUtility.RecursiveGetAllProperties(type, c_bindingFlags); IEnumerable <EventInfo> events = ReflectionUtility.RecursiveGetAllEvents(type, c_bindingFlags); var overriddenMemberFilter = new OverriddenMemberFilter(); methods = overriddenMemberFilter.RemoveOverriddenMembers(methods); properties = overriddenMemberFilter.RemoveOverriddenMembers(properties); events = overriddenMemberFilter.RemoveOverriddenMembers(events); AnalyzeProperties(properties); AnalyzeEvents(events); AnalyzeMethods(methods); }