一直很喜欢用李天平的“动软.Net代码生成器”,界面简洁、操作简单,用来开发辅助生成代码和生成Word文档,大大提高效率。唯一不喜欢的是实体层变量命名方式采用了变量用“_”+数据库字段名方式,属性名采用数据库字段名方式,个人更喜欢用变量首字母小写属性首字母大写的方式。国庆假期闲来无事,决定改造下生成实体层的方法,让其按照自己的习惯来命名,感谢李天平对代码生成器的开源,才使这次改造成为可能。
很容易就找到了实体层生成的类和方法LTP.BuilderModel.BuilderModel.CreatModelMethod(),去掉变量名前面的下划线很简单,直接删除即可,遇到的一个难题是如何把属性名的首字母变成大写,首先想到的是利用正则表达式。对正则表达式真是既爱又恨,爱是因为功能强大,处理文本问题几乎无所不能,恨是因为自己对正则表达式一直是一知半解,虽然专门学过几次,可由于求知欲不强加上悟性不够,一直没能理解正则表达式的本质,每次用到都要借助网络。这次网络没能帮助我,倒是意外的发现了用C#字符串很容易就能实现首字母大写,只要一条语句即可string propertyColumnName = columnName.Substring(0, 1).ToUpper() + columnName.Substring(1)。是自己把问题想复杂了。完整的改造代码如下:
/// <summary>
/// 生成实体类的属性
/// </summary>
/// <returns></returns>
public string CreatModelMethod()
{
StringPlus strclass = new StringPlus();
StringPlus strclass1 = new StringPlus();
StringPlus strclass2 = new StringPlus();
//strclass.AppendSpaceLine(2, "#region Model");
strclass1.AppendSpaceLine(2, "");
strclass2.AppendSpaceLine(2, "");
foreach (ColumnInfo field in Fieldlist)
{
string columnName = field.ColumnName;
string columnType = field.TypeName;
bool IsIdentity = field.IsIdentity;
bool ispk = field.IsPK;
bool cisnull = field.cisNull;
string deText = field.DeText;
columnType = CodeCommon.DbTypeToCS(columnType);
string isnull = "";
if (CodeCommon.isValueType(columnType))
{
//if ((!IsIdentity) && (!ispk) && (cisnull))
//{
// isnull = "?";//代表可空类型
//}
}
//变量直接用数据库字段名
string privateColumnName = columnName;
//属性名需要把数据库字段名首字母大写
string propertyColumnName = columnName.Substring(0, 1).ToUpper() + columnName.Substring(1);
strclass1.AppendSpaceLine(2, "private " + columnType + isnull + " " + privateColumnName + ";");//私有变量
strclass2.AppendSpaceLine(2, "/// <summary>");
strclass2.AppendSpaceLine(2, "/// " + deText);
strclass2.AppendSpaceLine(2, "/// </summary>");
strclass2.AppendSpaceLine(2, "public " + columnType + isnull + " " + propertyColumnName);//属性
strclass2.AppendSpaceLine(2, "{");
strclass2.AppendSpaceLine(3, "set {" + privateColumnName + "=value;}");
strclass2.AppendSpaceLine(3, "get {return " + privateColumnName + ";}");
strclass2.AppendSpaceLine(2, "}");
}
strclass.Append(strclass1.Value);
strclass.Append(strclass2.Value);
//strclass.AppendSpaceLine(2, "#endregion Model");
return strclass.ToString();
}
重新编译项目,将LTP.BuilderModel.dll替代原安装目录中的dll,打开代码生成器生成代码,生成的实体层变成自己习惯的命名规则了^_^。其实这次改造并不难,但有两点体会:一是开源真的很方便,可以按需修改,满足自己或者说是开发团队的需求;二是C#(语言)基础要好好掌握,不能一遇到问题就求助网络,先从基础着手解决问题,改掉思维定势。