コード例 #1
0
        private IEnumerable <InjectionDefinition> CreateInjections(IMemberDefinition target, InjectionInfo injection, CustomAttribute trigger)
        {
            if (IsAspectMember(target))
            {
                return(Enumerable.Empty <InjectionDefinition>());
            }

            return(injection.aspect.Effects.Where(e => e.IsApplicableFor(target)).Select(e => new InjectionDefinition()
            {
                Target = target,
                Source = injection.aspect,
                Priority = injection.priority,
                Effect = e,
                Triggers = trigger == null ? new List <CustomAttribute>() : new List <CustomAttribute> {
                    trigger
                }
            }));
        }
コード例 #2
0
        private IEnumerable <InjectionDefinition> FindApplicableMembers(ICustomAttributeProvider target, InjectionInfo injection, CustomAttribute trigger)
        {
            var result = Enumerable.Empty <InjectionDefinition>();

            Func <ICustomAttributeProvider, bool> additionalFilter = (provider) => !provider.IsCompilerGenerated();

            if ((injection.propagation & PropagateTo.IncludeCompilerGenerated) != 0)
            {
                additionalFilter = (provider) => true;
            }


            if (target is AssemblyDefinition assm)
            {
                result = result.Concat(assm.Modules.SelectMany(nt => FindApplicableMembers(nt, injection, trigger)));
            }

            if (target is ModuleDefinition module && (injection.propagation & PropagateTo.Types) != 0)
            {
                result = result.Concat(module.Types.SelectMany(nt => FindApplicableMembers(nt, injection, trigger)));
            }

            if (target is IMemberDefinition member && (injection.filter == null || injection.filter.IsMatch(member.Name)))
            {
                result = result.Concat(CreateInjections(member, injection, trigger));
            }

            if (target is TypeDefinition type)
            {
                if ((injection.propagation & PropagateTo.Methods) != 0)
                {
                    result = result.Concat(type.Methods.Where(m => additionalFilter(m) && (m.IsNormalMethod() || m.IsConstructor)).SelectMany(m => FindApplicableMembers(m, injection, trigger)));
                }
                if ((injection.propagation & PropagateTo.Events) != 0)
                {
                    result = result.Concat(type.Events.Where(e => additionalFilter(e)).SelectMany(m => FindApplicableMembers(m, injection, trigger)));
                }
                if ((injection.propagation & PropagateTo.Properties) != 0)
                {
                    result = result.Concat(type.Properties.Where(p => additionalFilter(p)).SelectMany(m => FindApplicableMembers(m, injection, trigger)));
                }
                if ((injection.propagation & PropagateTo.Types) != 0)
                {
                    result = result.Concat(type.NestedTypes.Where(nt => additionalFilter(nt)).SelectMany(nt => FindApplicableMembers(nt, injection, trigger)));
                }
            }

            return(result);
        }