C#动态生成属性

pychen402 2016-03-27 12:45:52
请问propertyGrid如何自动生成属性,比如我有一个DataTable,我用来一个类myclass来表示DataTable,类的属性就是DataTable的列名,然后propertygrid.selectedObject =myclass就可以在propertygrid中显示列名,但是,由于DataTable的列数的不确定的,请问如何可以实现动态的显示这些属性
...全文
184 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
pychen402 2016-03-28
  • 打赏
  • 举报
回复
解决了,谢谢
qbilbo 2016-03-27
  • 打赏
  • 举报
回复
引用:System.Reflection,System.Reflection.Emit 窗体上放一个Button,一个PropertyGrid控件。
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();
}

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧