コード例 #1
0
        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
        }
コード例 #2
0
        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)));
        }
コード例 #3
0
        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);
        }