Exemplo n.º 1
0
        private bool WeaveMethod(
            ModuleDefinition module,
            MethodDefinition method,
            List <AspectInfo> aspectInfos)
        {
            aspectInfos = AspectOrderer.Order(aspectInfos);
            var aspectInfosWithMethods = aspectInfos
                                         .Where(x => !x.SkipProperties || (!method.IsGetter && !method.IsSetter))
                                         .ToList();

            var methodWeaver = MethodWeaverFactory.MakeWeaver(module, method, aspectInfosWithMethods);

            methodWeaver.Weave();
            if (methodWeaver.WeaveCounter == 0)
            {
                return(false);
            }

            if (method.IsGetter || method.IsSetter)
            {
                TotalWeavedProperties++;
            }
            else
            {
                TotalWeavedMethods++;
            }

            return(true);
        }
        private bool WeaveMethod(
            ModuleDefinition module,
            MethodDefinition method,
            List <AspectInfo> aspectInfos,
            TypeReference type)
        {
            aspectInfos = AspectOrderer.Order(aspectInfos);
            aspectInfos.Reverse(); // last aspect has to be weaved in first

            using (var methodWeaver = new MethodWeaver())
            {
                foreach (var aspectInfo in aspectInfos)
                {
                    ////var log = string.Format("Weave OnMethodBoundaryAspect '{0}' in method '{1}' from class '{2}'",
                    ////    attributeTypeDefinition.Name,
                    ////    method.Name,
                    ////    method.DeclaringType.FullName);
                    ////LogWarning(log);

                    if (aspectInfo.SkipProperties && (method.IsGetter || method.IsSetter))
                    {
                        continue;
                    }

                    var aspectTypeDefinition = aspectInfo.AspectAttribute.AttributeType;

                    var overriddenAspectMethods = GetUsedAspectMethods(aspectTypeDefinition);
                    if (overriddenAspectMethods == AspectMethods.None)
                    {
                        continue;
                    }

                    methodWeaver.Weave(method, aspectInfo.AspectAttribute, overriddenAspectMethods, module, type, UnweavedAssembly);
                }

                if (methodWeaver.WeaveCounter == 0)
                {
                    return(false);
                }
            }

            if (method.IsGetter || method.IsSetter)
            {
                TotalWeavedPropertyMethods++;
            }
            else
            {
                TotalWeavedMethods++;
            }

            LastWeavedMethod = method;
            return(true);
        }