利用一个下午吧,自己制作了一个实体类生成器。我们都知道,利用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
{
///
/// 实体类的头部信息,作者、类说明、类名、命名空间
///
class HeaderOfEntity
{
private string className;
///
/// 类的名称
///
public string ClassName
{
get { return className; }
set { className = value; }
}
private string classExplain;
///
/// 类的说明
///
public string ClassExplain
{
get { return classExplain; }
set { classExplain = value; }
}
private string classAuthor;
///
/// 类的创建者
///
public string ClassAuthor
{
get { return classAuthor; }
set { classAuthor = value; }
}
private string nameSpace;
///
/// 类的命名空间
///
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(" /// \n" + " /// " + headerOfEntity.ClassExplain + "\n /// ");
//写类的定义
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" + " /// \n" + " /// " + dt.Rows[i][2] + "\n" +
" /// \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;
}
///
/// 用来将首字母大写,如果以下划线开头,则把第二个字母大写
///
/// 传入的字符串
///
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);
}
}
}
希望大家指出不足之处,留下您的宝贵意见!
下载地址