Exemple #1
0
        public ProxyScope(ModuleScope moduleScope, TypeBuilder typeBuilder, ProxyTypeDefinition typeDefinition)
        {
            if (moduleScope is null)
            {
                throw new ArgumentNullException(nameof(moduleScope));
            }
            if (typeBuilder is null)
            {
                throw new ArgumentNullException(nameof(typeBuilder));
            }
            if (typeDefinition is null)
            {
                throw new ArgumentNullException(nameof(typeDefinition));
            }

            this.fields           = new List <FieldBuilder>();
            this.properties       = new List <PropertyBuilder>();
            this.methods          = new List <MethodBuilder>();
            this.events           = new List <EventBuilder>();
            this.propertyMappings = new List <PropertyMapping>();
            this.methodMappings   = new List <MethodMapping>();
            this.eventMappings    = new List <EventMapping>();

            this.moduleScope    = moduleScope;
            this.typeBuilder    = typeBuilder;
            this.typeDefinition = typeDefinition;

            interceptableMethodBuilder = typeDefinition.Options?.InterceptableMethodBuilder;
            if (interceptableMethodBuilder == null)
            {
                interceptableMethodBuilder = new InterceptableMethodBuilder();
            }
        }
Exemple #2
0
        public Type CreateProxyType(ProxyTypeDefinition typeDefinition, object target)
        {
            Type proxyType = moduleScope.GetOrCreateProxyType(typeDefinition);

            OnProxyTypeCreated(typeDefinition.Type, target, proxyType);
            return(proxyType);
        }
Exemple #3
0
        protected object ProtectedCreateClassProxy(Type type, object target, ProxyGeneratorOptions options, IInterceptor[] interceptors)
        {
            if (type is null)
            {
                throw new ArgumentNullException(nameof(type));
            }
            if (type.IsInterface)
            {
                throw new InvalidOperationException($"Unexpected interface for '{type.Name}'");
            }
            if (target != null && !type.IsAssignableFrom(target.GetType()))
            {
                throw new InvalidOperationException($"The target '{target.GetType().Name}' is not assignable from '{type.Name}'");
            }
            ProxyTypeDefinition typeDefinition = GetTypeDefinition(type, target, options);

            return(CreateProxy(typeDefinition, interceptors, target));
        }
Exemple #4
0
        protected object[] GetArguments(ProxyTypeDefinition typeDefinition, IInterceptor[] interceptors, object target, Type proxyType)
        {
            List <object> args = new List <object>();

            // interceptors
            args.Add(interceptors);

            // target
            if (target != null)
            {
                args.Add(target);
            }

            // interceptorSelector
            ProxyGeneratorOptions options             = typeDefinition.Options;
            IInterceptorSelector  interceptorSelector = options?.InterceptorSelector;

            if (interceptorSelector != null)
            {
                args.Add(interceptorSelector);
            }

            // mixins
            if (options != null && options.MixinInstances.Count > 0)
            {
                args.AddRange(options.MixinInstances);
            }

            // base ctor dependencies
            ConstructorInfo constructor = proxyType.GetConstructors()[0];
            var             parameters  = constructor.GetParameters();
            int             length      = parameters.Length;

            if (length > args.Count)
            {
                for (int i = args.Count; i < length; i++)
                {
                    args.Add(ConstructorInjectionResolver.Resolve(parameters[i]));
                }
            }

            return(args.ToArray());
        }
Exemple #5
0
        internal Type GetOrCreateProxyType(ProxyTypeDefinition typeDefinition)
        {
            if (typeDefinition is null)
            {
                throw new ArgumentNullException(nameof(typeDefinition));
            }

            string name = typeDefinition.Name;
            Type   type = proxyTypes.FirstOrDefault(p => p.Name == name);

            if (type == null)
            {
                TypeBuilder typeBuilder = Module.DefineType(typeDefinition.FullName, typeDefinition.TypeAttributes);
                ProxyScope  proxyScope  = new ProxyScope(this, typeBuilder, typeDefinition);
                proxyScope.DefineTypeAndMembers();
                type = typeBuilder.BuildType();
                proxyTypes.Add(type);
            }
            return(type);
        }
Exemple #6
0
        protected object CreateProxy(ProxyTypeDefinition typeDefinition, IInterceptor[] interceptors, object target)
        {
            if (typeDefinition is null)
            {
                throw new ArgumentNullException(nameof(typeDefinition));
            }
            if (interceptors is null)
            {
                throw new ArgumentNullException(nameof(interceptors));
            }

            Type proxyType = CreateProxyType(typeDefinition, target);

            object[] args = GetArguments(typeDefinition, interceptors, target, proxyType);

            //#if NET45 || NET472
            //            moduleScope.Save();
            //#endif

            return(CreateProxyInstance(proxyType, args));
        }