public PolymorphicTypeBuilder <T> Add <T>()
        {
            var polymorphicTypeBuilder = new PolymorphicTypeBuilder <T>();

            TypeBuilders.Add(polymorphicTypeBuilder);
            return(polymorphicTypeBuilder);
        }
Ejemplo n.º 2
0
        private FormElement Build(IFormProperty property, Func <string, object> deserializer)
        {
            var element = Build(property, deserializer, PropertyBuilders);

            if (element == null && TypeBuilders.TryGetValue(property.PropertyType, out var builders))
            {
                element = Build(property, deserializer, builders);
            }

            return(element);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 映射物理表
        /// </summary>
        /// <param name="absTable">抽象表类型</param>
        /// <param name="targetTableName">目标物理表名</param>
        /// <param name="targetTableName">所在层集如 "TM.Entity"</param>
        /// <returns></returns>
        public static Type MapTable(Type absTable, string targetTableName, string assemblyName)
        {
            var config = TypeBuilders.GetConfig(absTable);

            //实体必须放到Entity层中,不然会出现莫名调试BUG,原因未知
            config.AssemblyName = assemblyName;
            config.Attributes.RemoveAll(x => x.Attribute == typeof(TableAttribute));
            config.FullName = $"{assemblyName}.{targetTableName}";

            return(TypeBuilders.BuildType(config));
        }
        public Type CreateContextType(List <Table> tables)
        {
            Type        PocoType;
            TypeBuilder PocoTypeBuilder;

            //TypeBuilder ClassTypeBuilder;

            Types.Clear();
            TypeBuilders.Clear();

            //Context
            ContextTypeBuilder = DynamicTypeBuilder.GetTypeBuilder("Context", typeof(DbContextBase));

            //Context Constructor
            System.Reflection.Emit.ConstructorBuilder constructor = ContextTypeBuilder.DefineDefaultConstructor(System.Reflection.MethodAttributes.Public | System.Reflection.MethodAttributes.SpecialName | System.Reflection.MethodAttributes.RTSpecialName);

            //Create Normal Poco Type to be used as a reference
            foreach (Table table in tables)
            {
                TypeBuilders.Add(table.VariableName, CreatePocoTypeBuilder(table));
            }


            //Navigation properties
            foreach (Table table in tables)
            {
                CreateNavigationProperties(table);
            }


            //Creates DbSet Propeties for the Context
            foreach (Table ti in tables)
            {
                PocoTypeBuilder = TypeBuilders[ti.VariableName];
                PocoType        = PocoTypeBuilder.CreateType();
                Types.Add(ti.VariableName, PocoType);
                DynamicTypeBuilder.CreateProperty(ContextTypeBuilder, ti.VariableName, typeof(DbSet <>).MakeGenericType(new Type[] { PocoType }), false);
            }


            Type type = ContextTypeBuilder.CreateType();


            return(type);
        }
        public Type CreateContextType(List <Table> tables, string cString)
        {
            Types.Clear();
            TypeBuilders.Clear();

            _logger.LogTrace("Start building runtime DynamicDbContext");

            //Context
            ContextTypeBuilder = _typeBuilder.GetTypeBuilder("DynamicDbContext", typeof(DbContextBase));

            //Context Constructor
            System.Reflection.Emit.ConstructorBuilder constructor = ContextTypeBuilder.DefineDefaultConstructor(
                System.Reflection.MethodAttributes.Public |
                System.Reflection.MethodAttributes.SpecialName |
                System.Reflection.MethodAttributes.RTSpecialName);

            //Create Normal Poco Type to be used as a reference
            foreach (Table table in tables)
            {
                TypeBuilders.Add(table.VariableName, CreatePocoTypeBuilder(table));
            }

            _logger.LogTrace("Start building navigation properties");

            //Navigation properties
            foreach (Table table in tables)
            {
                CreateNavigationProperties(table);
            }

            _logger.LogTrace("Start building Dbset for each table");

            //Creates DbSet Properties for the Context
            foreach (Table ti in tables)
            {
                var pocoTypeBuilder = TypeBuilders[ti.VariableName];
                var pocoType        = pocoTypeBuilder.CreateType();
                Types.Add(ti.VariableName, pocoType);

                _typeBuilder.CreateProperty(ContextTypeBuilder, ti.VariableName,
                                            typeof(DbSet <>).MakeGenericType(new Type[] { pocoType }), false);
            }

            _logger.LogTrace("Start building OnConfiguring override method.");

            // context OnConfiguring method override.
            var onConfiguringMethod = ContextTypeBuilder.OverrideOnConfiguring(cString);

            ContextTypeBuilder.DefineMethodOverride(onConfiguringMethod,
                                                    typeof(DbContext).GetMethod("OnConfiguring", BindingFlags.Instance | BindingFlags.NonPublic));

            Type type = ContextTypeBuilder.CreateType();

            if (_config.SaveLibraryRunTime)
            {
                _logger.LogTrace("Try saving the created DbContext into the disk.");

                _typeBuilder.SaveTypeBuilder(ContextTypeBuilder, "DynamicDataStore");
            }

            _logger.LogTrace("Done building Dynamic DbContext.");

            return(type);
        }