BlueSky.Model.VirtualListDynamic.GetObjectType C# (CSharp) Method

GetObjectType() private method

private GetObjectType ( List vars ) : Type
vars List
return System.Type
        private Type GetObjectType(List<DataSourceVariable> vars)
        {
            AssemblyName assemblyName = new AssemblyName();
            assemblyName.Name = "tmpAssembly";
            AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
            ModuleBuilder module = assemblyBuilder.DefineDynamicModule("tmpModule");
            int varnameidx=0;
            // create a new type builder
            TypeBuilder typeBuilder = module.DefineType("BindableRowCellCollection", TypeAttributes.Public | TypeAttributes.Class);
            
            foreach (DataSourceVariable var in vars)
            {
                //Type type = typeof(string);
                Type type = (var.DataClass.Equals("POSIXct") || var.DataClass.Equals("POSIXlt") || var.DataClass.Equals("Date")) ? typeof(DateTime) : typeof(string);
                string propertyName = var.Name.Replace(".", "_").Replace("(", "_").Replace(")", "_"); //varname should not have ".". Some more invalid chars can also be added here.
                
                #region Create Unique VarName ( Property name ). Duplicate property names are not allowed in C# 
                //varnameidx=0;
                //while(true)//loop till unique name is not created
                //{
                    
                //    propertyName = propertyName + varnameidx; //adding index at end to get new name   
                //}
                #endregion
                
                // Generate a private field
                FieldBuilder field = typeBuilder.DefineField("_" + propertyName, typeof(string), FieldAttributes.Private);
                // Generate a public property
                PropertyBuilder property =
                    typeBuilder.DefineProperty(propertyName,
                                     PropertyAttributes.None,
                                     type,
                                     new Type[] { type });

                // The property set and property get methods require a special set of attributes:

                MethodAttributes GetSetAttr =
                    MethodAttributes.Public |
                    MethodAttributes.HideBySig;

                // Define the "get" accessor method for current private field.
                MethodBuilder currGetPropMthdBldr =
                    typeBuilder.DefineMethod("get_value",
                                               GetSetAttr,
                                               type,
                                               Type.EmptyTypes);

                // Intermediate Language stuff...
                ILGenerator currGetIL = currGetPropMthdBldr.GetILGenerator();
                currGetIL.Emit(OpCodes.Ldarg_0);
                currGetIL.Emit(OpCodes.Ldfld, field);
                currGetIL.Emit(OpCodes.Ret);

                // Define the "set" accessor method for current private field.
                MethodBuilder currSetPropMthdBldr =
                    typeBuilder.DefineMethod("set_value",
                                               GetSetAttr,
                                               null,
                                               new Type[] { type });

                // Again some Intermediate Language stuff...
                ILGenerator currSetIL = currSetPropMthdBldr.GetILGenerator();
                currSetIL.Emit(OpCodes.Ldarg_0);
                currSetIL.Emit(OpCodes.Ldarg_1);
                currSetIL.Emit(OpCodes.Stfld, field);
                currSetIL.Emit(OpCodes.Ret);

                // Last, we must map the two methods created above to our PropertyBuilder to 
                // their corresponding behaviors, "get" and "set" respectively. 
                property.SetGetMethod(currGetPropMthdBldr);
                property.SetSetMethod(currSetPropMthdBldr);
            }
            Type generetedType = typeBuilder.CreateType();
            return generetedType;
        }