コード例 #1
0
        private void Build(BuildStep step, AbstractTypeBuilderList builders)
        {
            _context.Step = step;
            _context.TypeBuilders.Clear();

            foreach (IAbstractTypeBuilder builder in builders)
            {
                if (builder.IsApplied(_context, builders))
                {
                    _context.TypeBuilders.Add(builder);
                }
            }

            if (_context.IsVirtualMethod || _context.IsVirtualProperty)
            {
                _context.TypeBuilders.Add(_defaultTypeBuilder);
            }

            if (_context.TypeBuilders.Count == 0)
            {
                return;
            }

            CheckCompatibility(_context, _context.TypeBuilders);

            _context.TypeBuilders.Sort(new BuilderComparer(_context));

            for (int i = 0; i < _context.TypeBuilders.Count; i++)
            {
                IAbstractTypeBuilder builder = _context.TypeBuilders[i];

                builder.Build(_context);
            }
        }
コード例 #2
0
        private static void CheckCompatibility(BuildContext context, AbstractTypeBuilderList builders)
        {
            for (int i = 0; i < builders.Count; i++)
            {
                IAbstractTypeBuilder cur = builders[i];

                if (cur == null)
                {
                    continue;
                }

                for (int j = 0; j < builders.Count; j++)
                {
                    IAbstractTypeBuilder test = builders[j];

                    if (i == j || test == null)
                    {
                        continue;
                    }

                    if (cur.IsCompatible(context, test) == false)
                    {
                        builders[j] = null;
                    }
                }
            }

            for (int i = 0; i < builders.Count; i++)
            {
                if (builders[i] == null)
                {
                    builders.RemoveAt(i--);
                }
            }
        }
コード例 #3
0
        public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
        {
            if (context.IsBuildStep)
            {
                return(false);
            }

            AbstractTypeBuilderList list = new AbstractTypeBuilderList(2);

            list.Add(this);
            list.Add(typeBuilder);

            BuildStep step = context.Step;

            try
            {
                context.Step = BuildStep.Build;

                return(typeBuilder.IsApplied(context, list));
            }
            finally
            {
                context.Step = step;
            }
        }
コード例 #4
0
		public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
		{
			if (typeBuilder is PropertyChangedBuilder)
				return false;

			return base.IsCompatible(context, typeBuilder);
		}
コード例 #5
0
        protected bool IsRelative(IAbstractTypeBuilder typeBuilder)
        {
            if (typeBuilder == null)
            {
                throw new ArgumentNullException("typeBuilder");
            }

            return(GetType().IsInstanceOfType(typeBuilder) || typeBuilder.GetType().IsInstanceOfType(this));
        }
コード例 #6
0
        public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
        {
            if (typeBuilder is PropertyChangedBuilder)
            {
                return(false);
            }

            return(base.IsCompatible(context, typeBuilder));
        }
コード例 #7
0
        private static AbstractTypeBuilderList GetBuilders(object[] attributes, object target)
        {
            AbstractTypeBuilderList builders = new AbstractTypeBuilderList(attributes.Length);

            foreach (AbstractTypeBuilderAttribute attr in attributes)
            {
                IAbstractTypeBuilder builder = attr.TypeBuilder;

                builder.TargetElement = target;
                builders.Add(builder);
            }

            return(builders);
        }
コード例 #8
0
		public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
		{
			if (context.IsBuildStep)
				return false;

			var list = new AbstractTypeBuilderList(2) { this, typeBuilder };
			var step = context.Step;

			try
			{
				context.Step = BuildStep.Build;

				return typeBuilder.IsApplied(context, list);
			}
			finally
			{
				context.Step = step;
			}
		}
コード例 #9
0
        private static AbstractTypeBuilderList GetBuilders(ParameterInfo[] parameters)
        {
            AbstractTypeBuilderList builders = new AbstractTypeBuilderList();

            foreach (ParameterInfo pi in parameters)
            {
                object[] attributes = pi.GetCustomAttributes(typeof(AbstractTypeBuilderAttribute), true);

                foreach (AbstractTypeBuilderAttribute attr in attributes)
                {
                    IAbstractTypeBuilder builder = attr.TypeBuilder;

                    builder.TargetElement = pi;
                    builders.Add(builder);
                }
            }

            return(builders);
        }
コード例 #10
0
        private static AbstractTypeBuilderList GetBuilderList(TypeHelper type)
        {
            object[] attrs = type.GetAttributes(typeof(AbstractTypeBuilderAttribute));

            AbstractTypeBuilderList builders = new AbstractTypeBuilderList(attrs.Length);

            foreach (AbstractTypeBuilderAttribute attr in attrs)
            {
                IAbstractTypeBuilder builder = attr.TypeBuilder;

                if (builder != null)
                {
                    builder.TargetElement = type;
                    builders.Add(builder);
                }
            }

            return(builders);
        }
コード例 #11
0
        private void DefineInterfaces()
        {
            foreach (KeyValuePair <TypeHelper, IAbstractTypeBuilder> de in _context.InterfaceMap)
            {
                _context.CurrentInterface = de.Key;

                MethodInfo[] interfaceMethods = _context.CurrentInterface.GetMethods();

                foreach (MethodInfo m in interfaceMethods)
                {
                    if (_context.TypeBuilder.OverriddenMethods.ContainsKey(m))
                    {
                        continue;
                    }

                    BeginEmitMethod(m);

                    // Call builder to build the method.
                    //
                    IAbstractTypeBuilder builder = de.Value;

                    if (builder != null)
                    {
                        builder.ID = ++_idCounter;

                        _context.BuildElement = BuildElement.InterfaceMethod;
                        _context.Step         = BuildStep.Build;
                        builder.Build(_context);
                    }

                    EndEmitMethod();
                }

                _context.CurrentInterface = null;
            }
        }
コード例 #12
0
        public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
        {
            if (context.IsBuildStep)
            {
                return(false);
            }

            var list = new List <IAbstractTypeBuilder>(2)
            {
                this, typeBuilder
            };
            var step = context.Step;

            try
            {
                context.Step = BuildStep.Build;

                return(typeBuilder.IsApplied(context, list));
            }
            finally
            {
                context.Step = step;
            }
        }
コード例 #13
0
 public virtual bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
 {
     return(true);
 }
コード例 #14
0
        public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
        {
            var builder = typeBuilder as InterceptorAspectBuilder;

            return(builder == null || _interceptorType != builder._interceptorType);
        }
コード例 #15
0
		public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
		{
			var builder = typeBuilder as InterceptorAspectBuilder;

			return builder == null || _interceptorType != builder._interceptorType;
		}
コード例 #16
0
 public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
 {
     return(!(typeBuilder is InterceptorAspectBuilder builder) || _interceptorType != builder._interceptorType);
 }
コード例 #17
0
 public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
 {
     return(IsRelative(typeBuilder) == false);
 }
コード例 #18
0
		public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
		{
			return IsRelative(typeBuilder) == false;
		}
コード例 #19
0
 private bool IsApplied(IAbstractTypeBuilder builder, AbstractTypeBuilderList builders, BuildStep buildStep)
 {
     _context.Step = buildStep;
     return(builder.IsApplied(_context, builders));
 }
コード例 #20
0
		public virtual bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
		{
			return true;
		}
コード例 #21
0
		protected bool IsRelative(IAbstractTypeBuilder typeBuilder)
		{
			if (typeBuilder == null) throw new ArgumentNullException("typeBuilder");

			return GetType().IsInstanceOfType(typeBuilder) || typeBuilder.GetType().IsInstanceOfType(this);
		}
コード例 #22
0
 public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
 {
     return(true);
 }
コード例 #23
0
		public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
		{
			return true;
		}