111,128
社区成员
发帖
与我相关
我的任务
分享private void button1_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
DataColumn[] cols = new DataColumn[3];
cols[0] = new DataColumn("AAA", typeof(int));
cols[1] = new DataColumn("BBB", typeof(string));
cols[2] = new DataColumn("CCC", typeof(DateTime));
dt.Columns.AddRange(cols);
for (int i = 0; i < 10; i++)
{
dt.Rows.Add(new object[] { i + 1, (i + 1).ToString() + "F", DateTime.Now.AddHours(i) });
}
IEnumerable<object> objs = CreateObjects(dt);
foreach (var obj in objs)
{
propertyGrid1.SelectedObject = obj;
MessageBox.Show("点击确定继续下一个。");
}
}
private IEnumerable<object> CreateObjects(DataTable dt)
{
Type type = CreateType(dt);
PropertyInfo[] ps = type.GetProperties();
foreach (DataRow dr in dt.Rows)
{
object obj = Activator.CreateInstance(type);
for (int i = 0; i < dt.Columns.Count; i++)
{
ps[i].SetValue(obj, dr[dt.Columns[i]]);
}
yield return obj;
}
}
private Type CreateType(DataTable dt)
{
AssemblyName MyAssemblyName = new AssemblyName("MyAssembly");
AssemblyBuilder MyAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(MyAssemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder mb = MyAssembly.DefineDynamicModule(MyAssemblyName.Name);
TypeBuilder tb = mb.DefineType("MyClass", TypeAttributes.Public);
int i = 1;
foreach (DataColumn col in dt.Columns)
{
FieldBuilder fb = tb.DefineField("_f" + i.ToString(), col.DataType, FieldAttributes.Private);
var methodGet = tb.DefineMethod("_get" + col.ColumnName, MethodAttributes.Public, col.DataType, null);
var ilOfGet = methodGet.GetILGenerator();
ilOfGet.Emit(OpCodes.Ldarg_0);
ilOfGet.Emit(OpCodes.Ldfld, fb);
ilOfGet.Emit(OpCodes.Ret);
var methodSet = tb.DefineMethod("_set" + col.ColumnName, MethodAttributes.Public, null, new Type[] { col.DataType });
var ilOfSet = methodSet.GetILGenerator();
ilOfSet.Emit(OpCodes.Ldarg_0);
ilOfSet.Emit(OpCodes.Ldarg_1);
ilOfSet.Emit(OpCodes.Stfld, fb);
ilOfSet.Emit(OpCodes.Ret);
PropertyBuilder pb = tb.DefineProperty(col.ColumnName, System.Reflection.PropertyAttributes.None, col.DataType, null);
pb.SetGetMethod(methodGet);
pb.SetSetMethod(methodSet);
i++;
}
return tb.CreateType();
}