using System.Collections.Generic;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Reflection.Emit;
namespace RIC.CustomHelper
public static class GetSQLQueryReturnType
public static Type DynamicSqlQuery(Database DB, string SQL, Dictionary<string, object> Parameters = null)
TypeBuilder builder = createTypeBuilder(
"DynamicAssembly", "DynamicModule", "DynamicType");
using (SqlCommand command = (SqlCommand)DB.Connection.CreateCommand())
command.CommandText = SQL;
command.CommandTimeout = command.Connection.ConnectionTimeout;
foreach (KeyValuePair<string, object> element in Parameters)
command.Parameters.AddWithValue(element.Key, element.Value);
using (System.Data.IDataReader reader = command.ExecuteReader())
var schema = reader.GetSchemaTable();
foreach (System.Data.DataRow row in schema.Rows)
string name = (string)row["ColumnName"];
Type type = (Type)row["DataType"];
if (type != typeof(string) && (bool)row.ItemArray[schema.Columns.IndexOf("AllowDbNull")])
type = typeof(Nullable<>).MakeGenericType(type);
createAutoImplementedProperty(builder, name, type);
command.Parameters.Clear();
return builder.CreateType();
private static TypeBuilder createTypeBuilder(
string assemblyName, string moduleName, string typeName)
TypeBuilder typeBuilder = AppDomain
.DefineDynamicAssembly(new AssemblyName(assemblyName),
AssemblyBuilderAccess.Run)
.DefineDynamicModule(moduleName)
.DefineType(typeName, TypeAttributes.Public);
typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
private static void createAutoImplementedProperty(
TypeBuilder builder, string propertyName, Type propertyType)
const string PrivateFieldPrefix = "m_";
const string GetterPrefix = "get_";
const string SetterPrefix = "set_";
FieldBuilder fieldBuilder = builder.DefineField(
string.Concat(PrivateFieldPrefix, propertyName),
propertyType, FieldAttributes.Private);
PropertyBuilder propertyBuilder = builder.DefineProperty(
propertyName, System.Reflection.PropertyAttributes.HasDefault, propertyType, null);
MethodAttributes propertyMethodAttributes =
MethodAttributes.Public | MethodAttributes.SpecialName |
MethodAttributes.HideBySig;
MethodBuilder getterMethod = builder.DefineMethod(
string.Concat(GetterPrefix, propertyName),
propertyMethodAttributes, propertyType, Type.EmptyTypes);
ILGenerator getterILCode = getterMethod.GetILGenerator();
getterILCode.Emit(OpCodes.Ldarg_0);
getterILCode.Emit(OpCodes.Ldfld, fieldBuilder);
getterILCode.Emit(OpCodes.Ret);
MethodBuilder setterMethod = builder.DefineMethod(
string.Concat(SetterPrefix, propertyName),
propertyMethodAttributes, null, new Type[] { propertyType });
ILGenerator setterILCode = setterMethod.GetILGenerator();
setterILCode.Emit(OpCodes.Ldarg_0);
setterILCode.Emit(OpCodes.Ldarg_1);
setterILCode.Emit(OpCodes.Stfld, fieldBuilder);
setterILCode.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getterMethod);
propertyBuilder.SetSetMethod(setterMethod);