コード例 #1
0
        /// <summary>
        /// Applies the Type transformation to the target type.
        /// </summary>
        /// <param name="host">The target type</param>
        /// <param name="typeWeaver">The type weaver that will make the current set of modifications.</param>
        public static void Accept(this AssemblyDefinition host, ITypeWeaver typeWeaver)
        {
            var module = host.MainModule;
            var types  = module.Types.Where(typeWeaver.ShouldWeave).ToArray();

            foreach (var type in types)
            {
                typeWeaver.Weave(type);
            }
        }
コード例 #2
0
        public void Run()
        {
            ITypeWeaver            bulkWeaving              = null;
            var                    compositesQueue          = new Queue <ITypeWeaver>();
            AspectsAttributeWeaver aspectRepository         = null;
            AspectArgsMapperWeaver aspectArgsMapperWeaver   = null;
            var                    aspectDefinitionsTypeSet = new HashSet <Type>();

            var composites = typeFactory.Types.Select(type => new {
                Type       = type,
                Attributes = type.GetCustomAttributesArray <CompositeAttribute>()
            })
                             .Where(composite => composite.Attributes.Length > 0);

            var compositeWeavingSettings = composites.ToList(composite => {
                var compositeType       = composite.Type;
                var mixinsMap           = new MixinsMap(compositeType);
                var aspectMappedMembers = new AspectMemberMapper(compositeType, mixinsMap);
                var aspectsMap          = new AspectsMap(aspectMappedMembers);

                var aspectDefinitionsTypes = aspectsMap.SelectMany(aspectMap => {
                    return(aspectMap.Aspects.Select(aspectDefinition => {
                        return aspectDefinition.Aspect.AspectType;
                    }));
                });

                aspectDefinitionsTypeSet.AddRange(aspectDefinitionsTypes);

                return(new CompositeWeavingSettingsImpl {
                    Registry = registry,
                    MixinsMap = mixinsMap,
                    AspectsMap = aspectsMap,
                    CompositeType = compositeType,
                    AspectMemebrsCollection = aspectMappedMembers
                });
            });

            aspectArgsMapperWeaver = new AspectArgsMapperWeaver();
            aspectRepository       = new AspectsAttributeWeaver(aspectDefinitionsTypeSet);
            compositesQueue.Enqueue(aspectArgsMapperWeaver);
            compositesQueue.Enqueue(aspectRepository);

            compositeWeavingSettings.ForEach(compositeSettings => {
                IBuilder <ITypeWeaver> builder = null;

                compositeSettings.AspectRepository = aspectRepository;
                compositeSettings.AspectArgsMapper = aspectArgsMapperWeaver;
                builder = new CompositeTypeWeaverBuilder(compositeSettings);

                compositesQueue.Enqueue(builder.Build());
            });

            bulkWeaving = new BulkWeaving(compositesQueue);
            bulkWeaving.Weave();
        }
コード例 #3
0
        /// <summary>
        /// Modifies the chosen types in an assembly using the given type weaver.
        /// </summary>
        /// <param name="targetAssembly">The target assembly to be modified</param>
        /// <param name="weaver">The type weaver that will be used to modify the selected types.</param>
        /// <param name="typeFilter">The filter that will determine which types should be modified.</param>
        public static void WeaveWith(this AssemblyDefinition targetAssembly, ITypeWeaver weaver,
                                     Func <TypeReference, bool> typeFilter)
        {
            var module = targetAssembly.MainModule;
            var types  = module.Types.Where(t => typeFilter(t) && t.IsDefinition && weaver.ShouldWeave(t)).ToArray();

            foreach (var type in types)
            {
                weaver.Weave(type);
            }
        }
コード例 #4
0
ファイル: TypeWeaverVisitor.cs プロジェクト: kpaba/kpaba
 /// <summary>
 /// Initializes a new instance of the TypeWeaverVisitor class.
 /// </summary>
 /// <param name="weaver">The <see cref="ITypeWeaver"/> that will be used to modify a given type.</param>
 public TypeWeaverVisitor(ITypeWeaver weaver)
 {
     _weaver = weaver;
 }
コード例 #5
0
        /// <summary>
        /// Allows a <see cref="ITypeWeaver"/> instance to traverse any <see cref="IReflectionStructureVisitable"/>
        /// instance.
        /// </summary>
        /// <param name="visitable">The visitable object.</param>
        /// <param name="typeWeaver">The type weaver.</param>
        public static void Accept(this IReflectionStructureVisitable visitable, ITypeWeaver typeWeaver)
        {
            var visitor = new TypeWeaverVisitor(typeWeaver);

            visitable.Accept(visitor);
        }
コード例 #6
0
 /// <summary>
 /// Allows a <see cref="ITypeWeaver"/> instance to traverse any <see cref="IReflectionStructureVisitable"/>
 /// instance.
 /// </summary>
 /// <param name="visitable">The visitable object.</param>
 /// <param name="typeWeaver">The type weaver.</param>
 public static void Accept(this IReflectionStructureVisitable visitable, ITypeWeaver typeWeaver)
 {
     var visitor = new TypeWeaverVisitor(typeWeaver);
     visitable.Accept(visitor);
 }
コード例 #7
0
 /// <summary>
 /// Applies the Type transformation to the target type.
 /// </summary>
 /// <param name="host">The target type</param>
 /// <param name="typeWeaver">The type weaver that will make the current set of modifications.</param>
 public static void Accept(this TypeDefinition host, ITypeWeaver typeWeaver)
 {
     typeWeaver.Weave(host);
 }
コード例 #8
0
ファイル: TypeWeaverVisitor.cs プロジェクト: slieser/LinFu
 /// <summary>
 /// Initializes a new instance of the TypeWeaverVisitor class.
 /// </summary>
 /// <param name="weaver">The <see cref="ITypeWeaver"/> that will be used to modify a given type.</param>
 public TypeWeaverVisitor(ITypeWeaver weaver)
 {
     _weaver = weaver;
 }
コード例 #9
0
 /// <summary>
 /// Modifies all the types in an assembly using the given type weaver.
 /// </summary>
 /// <param name="targetAssembly">The target assembly to be modified.</param>
 /// <param name="weaver">The weaver that will perform the modification.</param>
 public static void WeaveWith(this AssemblyDefinition targetAssembly, ITypeWeaver weaver)
 {
     WeaveWith(targetAssembly, weaver, _ => true);
 }