public void AddType(string name, DynamicTypeInfo info) { lock (accessLock) { this.dynamicTypeStore.Add(name, info); } }
public static Type ToDynamicType(this DataRow row, string typeName, out AssemblyBuilder assemblyBuilder) { if (DynamicTypeStore.Current.ContainsTypeInfo(typeName) && DynamicTypeStore.Current[typeName] != null) { DynamicTypeInfo info = DynamicTypeStore.Current[typeName]; assemblyBuilder = info.AssemblyBuilder; return(info.DynamicType); } else { TypeBuilder typeBuilder; GetAssemblyAndTypeBuilder(typeName, out assemblyBuilder, out typeBuilder); foreach (DataColumn column in row.Table.Columns) { CustomPropertyInfo propInfo = new CustomPropertyInfo(column.ColumnName, row[column].GetType()); AddPropertyToDynamicType(typeBuilder, propInfo); } Type returnType = typeBuilder.CreateType(); Expect.IsNotNull(DynamicTypeStore.Current[typeName], "DynamicTypeInfo was unexpectedly null."); DynamicTypeStore.Current[typeName].DynamicType = returnType; return(returnType); } }
private static void GetAssemblyAndTypeBuilder(string typeName, out AssemblyBuilder assemblyBuilder, out TypeBuilder typeBuilder) { if (DynamicTypeStore.Current.ContainsTypeInfo(typeName)) { DynamicTypeInfo info = DynamicTypeStore.Current[typeName]; assemblyBuilder = info.AssemblyBuilder; typeBuilder = info.TypeBuilder; } else { string name = typeName; AssemblyName assemblyName = new AssemblyName("DynamicGenerator"); assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll"); typeBuilder = moduleBuilder.DefineType(name, TypeAttributes.Public); DynamicTypeStore.Current.AddType(typeName, new DynamicTypeInfo { AssemblyBuilder = assemblyBuilder, TypeBuilder = typeBuilder, TypeName = typeName }); } }