利用一个下午吧,自己制作了一个实体类生成器。我们都知道,利用VS的封装字段的功能,只能一个一个的封闭,而且不能加上注释,所以自己制作了一个小程序,用来生成实体类。此程序,本人亲测,完全没有问题。
下面说一下,自己在制作的过程中,遇到的问题吧。
下面是我自己做了一个类图:
frmMain是界面
headerOfEntity:相当于一个实体吧,用来存储实体类的开头的信息
(作者、创建时间、类说明等)
IWriteEntity:一个接口,定义了如果写入的方法。
writeEntity:实体接口。
也相当于是面向接口编程吧,因为本人现在用C#语言用得比较多,
所以我所制作的实体类生成器是为C#生成实体的。
将来可能有的人想用来生成C++语句的实体,只需要定义这种语言的规范就好。
其实只要更改那个实现类WriteEntity就好。
下面是界面:
遇到的一个难题就是怎么把界面上的dataGridView里的数据传给IWriteEntity!后来,
用的是用dataTable过渡的方法。下面是我各个类的代码,不怕抛砖!!!
界面代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace CreateEntity { public partial class frmMain : Form { public frmMain() { InitializeComponent(); } private void btnCreateEntity_Click(object sender, EventArgs e) { HeaderOfEntity HeaderOfEntity = new HeaderOfEntity(); DataTable dt = new DataTable(); #region 实例化一个实体,并为这个实体类赋值 //实体类名不能为空 if (txtClassName.Text == "") { MessageBox.Show("类名不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } else { HeaderOfEntity.ClassName = txtClassName.Text.Trim(); } //实体类的说明 if (txtClassExplain.Text != "") { HeaderOfEntity.ClassExplain = txtClassExplain.Text.Trim(); } else { HeaderOfEntity.ClassExplain = ""; } //实体类的作者 if (txtAuthor.Text != "") { HeaderOfEntity.ClassAuthor = txtAuthor.Text.Trim(); } else { HeaderOfEntity.ClassAuthor = ""; } //类的命名空间 if (txtNamespace.Text != "") { HeaderOfEntity.NameSpace = txtNamespace.Text.Trim(); } else { HeaderOfEntity.NameSpace = ""; } #endregion #region 将dataGridView中的数据复制出来,复制到DataTable中,做为参数 //添加列 for (int i = 0; i < dgvAttribute.Columns.Count; i++) { dt.Columns.Add(dgvAttribute.Columns[i].Name); } //添加行 for (int j = 0; j < dgvAttribute.Rows.Count; j++) { DataRow dr = dt.NewRow(); for (int k = 0; k < dgvAttribute.Columns.Count; k++) { dr[k] = dgvAttribute.Rows[j].Cells[k].Value; } dt.Rows.Add(dr); } #endregion //实例化一个接口对象 IWriteEntity writeEntity = new WriteEntity(); //设置保存窗口的显示 saveDialog.Title = "将实体类保存到:"; saveDialog.FileName = HeaderOfEntity.ClassName.Trim(); DialogResult result = saveDialog.ShowDialog(); if (result==DialogResult.OK) { FileStream fs = new FileStream(saveDialog.FileName, FileMode.Create, FileAccess.Write); if (writeEntity.Write(fs,dt,HeaderOfEntity)==true ) { MessageBox.Show("写入文件成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("写入文件失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { return; } } private void frmMain_Load(object sender, EventArgs e) { } } }HeaderOfEntity:
/* *作者:刘帅 *创建时间:2012-04-10 10:38 *类说明:用来封闭实体类的头部信息 */ namespace CreateEntity { /// <summary> /// 实体类的头部信息,作者、类说明、类名、命名空间 /// </summary> class HeaderOfEntity { private string className; /// <summary> /// 类的名称 /// </summary> public string ClassName { get { return className; } set { className = value; } } private string classExplain; /// <summary> /// 类的说明 /// </summary> public string ClassExplain { get { return classExplain; } set { classExplain = value; } } private string classAuthor; /// <summary> /// 类的创建者 /// </summary> public string ClassAuthor { get { return classAuthor; } set { classAuthor = value; } } private string nameSpace; /// <summary> /// 类的命名空间 /// </summary> public string NameSpace { get { return nameSpace; } set { nameSpace = value; } } } }IWriteEntity:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Collections ; namespace CreateEntity { interface IWriteEntity { Boolean Write(FileStream fs, DataTable dt, HeaderOfEntity headerOfEntity); } }WriteEntity:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; namespace CreateEntity { class WriteEntity : IWriteEntity { public bool Write(FileStream fs, DataTable dt, HeaderOfEntity headerOfEntity) { //向流中写入字符 StreamWriter sw = new StreamWriter(fs); //写入类的头部信息 sw.WriteLine("/*\n" + "*作者:" + headerOfEntity.ClassAuthor + "\n" + "*创建时间:" + DateTime.Now.ToString() + " \n" + "*类说明:" + headerOfEntity.ClassExplain + "\n" + "*/\n"); //判断命名空间 if (headerOfEntity.NameSpace != "") { //写入命名空间 sw.WriteLine("namespace " + headerOfEntity.NameSpace + "\n{"); //写入类说明 sw.WriteLine(" /// <summary>\n" + " /// " + headerOfEntity.ClassExplain + "\n /// </summary>"); //写类的定义 sw.WriteLine(" class "+headerOfEntity.ClassName); sw.WriteLine(" {"); //写属性 for (int i =0; i < dt.Rows.Count-1; i++) { sw.WriteLine(" private " + dt.Rows[i][1].ToString() + " " + dt.Rows[i][0].ToString() + ";\n" + " /// <summary>\n" + " /// " + dt.Rows[i][2] + "\n" + " /// </summary>\n" + " public string " + FirstToUpper(dt.Rows[i][0].ToString()) + "\n" + " {\n" + " get { return " + dt.Rows[i][0].ToString() + "; }\n" + " set { " + dt.Rows[i][0].ToString() + " = value; }\n" + " }\n"); } sw.Write(" }\n"); sw.WriteLine("}"); } sw.Close(); fs.Close(); return true; } /// <summary> /// 用来将首字母大写,如果以下划线开头,则把第二个字母大写 /// </summary> /// <param name="letter">传入的字符串</param> /// <returns></returns> private string FirstToUpper(string letter) { string str; //这种情况是为Java的命名规范设计的 if (letter.Substring(0, 1) == "-") { str = letter.Substring(1, 1); str=str.ToUpper(); return str + letter.Substring(2); } str = letter.Substring(0, 1); str=str.ToUpper(); return str + letter.Substring(1); } } }
希望大家指出不足之处,留下您的宝贵意见!
下载地址