コード例 #1
0
        public Type Create(Type typeToProxy)
        {
            if (definedTypes.ContainsKey(typeToProxy))
            {
                return((Type)definedTypes[typeToProxy]);
            }
            if (!HasAopDefinitions(typeToProxy))
            {
                return(typeToProxy);
            }

            Type generatedType = generator.CreateType(type =>
            {
                type.Named(typeToProxy.Name + Guid.NewGuid());
                type.InheritFrom(typeToProxy);
                GeneratedField field = null;

                if (useServiceLocator)
                {
                    field = type.AddField <Microsoft.Practices.ServiceLocation.IServiceLocator>("serviceLocator");
                    type.AddConstructor(constructor => constructor.CreateArgument <Microsoft.Practices.ServiceLocation.IServiceLocator>().AssignTo(field));
                }

                ProxyMethods(type, typeToProxy, field);
            });

            return(generatedType);
        }
コード例 #2
0
        public void GenerateSchema()
        {
            TypeGenerator generator = new TypeGenerator();
            DataTable     dtTables = null, dtColumns = null;

            GetSchema(out dtTables, out dtColumns);
            CreateTables(dtTables);
            CreateColumns(dtColumns);
            foreach (var table in tables)
            {
                table.Type = generator.CreateType(table);
            }
        }
コード例 #3
0
        internal void Start()
        {
            assembly.Context.Register("Console", typeof(Console));
            // code.Compile(assembly);
            valueField = typeGen.DefineField("value", typeof(object), FieldAttributes.Private);
            valueField.SetCustomAttribute(typeof(DebuggerBrowsableAttribute), typeof(DebuggerBrowsableAttribute).GetInstanceCtor(typeof(DebuggerBrowsableState)), DebuggerBrowsableState.Never);
            // ctor
            var ctorParams = new ParameterInfo[] { new ParameterInfo("val", 0, typeof(object)) };
            ConstructorGenerator ctorGen = typeGen.DefineCtor(ctorParams, MethodAttributes.Public);

            ctorGen.SyntaxBody = new BlockStatement(new NodeList <Statement>
            {
                Expression.Assign(Expression.Member("value"), Expression.Parameter(ctorParams[0]))
            });

            EmitOpImplicit(typeGen);
            EmitOpAddition(typeGen);
            EmitToStringMethod();
            typeGen.CreateType();
            assembly.Save("FluidScript.Runtime.dll");
        }
コード例 #4
0
ファイル: TypeGeneratorTests.cs プロジェクト: legendz3/Siege
        public void Should_Create_Empty_Class_Type()
        {
            Type generatedType = generator.CreateType(context => context.Named("TestType1"));

            Assert.AreEqual("TestType1", generatedType.Name);
            Assert.AreEqual(4, generatedType.GetMethods().Length, "Should only have types from object");
            Assert.AreEqual(0, generatedType.GetProperties().Length, "Should have no properties");
            Assert.AreEqual(0, generatedType.GetFields().Length, "Should have no fields");
            Assert.AreEqual(1, generatedType.GetConstructors().Length, "Should have one constructor");
            Assert.AreEqual(0, generatedType.GetConstructor(new Type[0]).GetParameters().Length, "Should be a default constructor");
        }
コード例 #5
0
        public void Register(Type to, MappedType mappedType, ResolutionMap resolutionMap)
        {
            if (activators.ContainsKey(to))
            {
                return;
            }

            var generator = new TypeGenerator();

            var candidates     = mappedType.Candidates;
            int candidateCount = candidates.Count;

            for (int candidateCounter = 0; candidateCounter < candidateCount; candidateCounter++)
            {
                var candidate = candidates[candidateCounter];
                if (activators.ContainsKey(candidate.Type))
                {
                    continue;
                }

                var activatorType = generator.CreateType(context =>
                {
                    context.Named(Guid.NewGuid() + "Builder");
                    context.InheritFrom <SiegeActivator>();

                    context.OverrideMethod <SiegeActivator>(activator => activator.Instantiate(null), method => method.WithBody(body =>
                    {
                        var instance = body.CreateVariable(to);
                        var array    = body.CreateArray(typeof(object));
                        array.AssignFromParameter(new MethodParameter(0));
                        var items = new List <ILocalIndexer>();

                        var parameters     = candidate.Parameters;
                        var parameterCount = parameters.Count;
                        for (int i = 0; i < parameterCount; i++)
                        {
                            var info = parameters[i];
                            var arg1 = array.LoadValueAtIndex(info.ParameterType, body, info.Position);
                            items.Add(arg1);
                        }

                        var constructorArgs         = new Type[candidate.Parameters.Count];
                        var candidateParameters     = candidate.Parameters;
                        var candidateParameterCount = candidateParameters.Count;
                        for (int i = 0; i < candidateParameterCount; i++)
                        {
                            var arg = candidateParameters[i];

                            constructorArgs[arg.Position] = arg.ParameterType;
                        }

                        instance.AssignFrom(body.Instantiate(to, constructorArgs, items.OfType <ILocalIndexer, ILocalIndexer>()));
                        body.Return(instance);
                    }));
                });

                var constructor = activatorType.GetConstructor(new Type[] { });

                activators.Add(candidate.Type, (SiegeActivator)constructor.Invoke(new object[] { }));
            }
        }