自制C#实体类生成器


       利用一个下午吧,自己制作了一个实体类生成器。我们都知道,利用VS的封装字段的功能,只能一个一个的封闭,而且不能加上注释,所以自己制作了一个小程序,用来生成实体类。此程序,本人亲测,完全没有问题。
下面说一下,自己在制作的过程中,遇到的问题吧。
下面是我自己做了一个类图:

自制C#实体类生成器_第1张图片

frmMain是界面
headerOfEntity:相当于一个实体吧,用来存储实体类的开头的信息

(作者、创建时间、类说明等)
IWriteEntity:一个接口,定义了如果写入的方法。
writeEntity:实体接口。

也相当于是面向接口编程吧,因为本人现在用C#语言用得比较多,

所以我所制作的实体类生成器是为C#生成实体的。

将来可能有的人想用来生成C++语句的实体,只需要定义这种语言的规范就好。

其实只要更改那个实现类WriteEntity就好。
      下面是界面:

自制C#实体类生成器_第2张图片

遇到的一个难题就是怎么把界面上的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);
        }
    }
}

希望大家指出不足之处,留下您的宝贵意见!

下载地址

你可能感兴趣的:(String,object,C#,Class,语言,interface)