生成Model层代码的文件SetModel.cs源码如下:
public class SetModel
{
//提供对基于视图的编辑操作和选定文本的访问
/*
* TextSelection 对象的属性和方法直接反映了 Visual Studio 集成开发环境 (IDE) 中的编辑器命令。
* 像环境一样,文本选定操作受编辑器全局状态的影响,比如编辑器是处于覆盖模式还是处于虚拟空白模式。
* 如果影响了只读块中包含的任何字符,或者文本文档本身是只读的,则任何试图修改该文本文档的操作都将失败。
* 如果关联文档为 HTML 文档,则 TextSelection 对象的某些属性和方法可能会失败。
* 可能的失败原因是:显示 HTML 文档的窗口不在源视图内,或文本文档背后的数据为锁定状态。
* TextSelecttion的成员说明:http://msdn.microsoft.com/zh-cn/magazine/envdte.textselection_members(VS.90).aspx
*/
private TextSelection ts;
private TableFrame tableframe;
private string namespacestr;
private string folder;
private string modelname;
public SetModel(TextSelection _ts, TableFrame _tableframe, string _namespacestr, string _modelname, string _folder)
{
this.ts = _ts;
this.tableframe = _tableframe;
this.namespacestr = _namespacestr;
this.modelname = _modelname;
this.folder = _folder;
}
public void SetText()
{
ts.SelectAll();
//Text是设置或获取选定的文本,所以在这上面需要先全选ts中自动生成的代码,然后再替换。
ts.Text = GetText().ToString();
}
private StringBuilder GetText()
{
DataType datatype = new DataType();
StringBuilder _str = new StringBuilder();
//注意看下行代码,我在生成的第一行代码前加了注释标识/*,这是因为如果不加这个标识,在生成代码的过程中,vs会自动排版代码,造成代码上下错误,大家可以去掉这个测试一下。
_str.Append("/*using System;\n");
_str.Append("namespace ").Append(namespacestr).Append(".").Append(modelname).Append(".").Append(folder).Append("\n");
_str.Append("{").Append("\n");
_str.Append("public class ").Append(tableframe.TableName).Append("\n");
_str.Append("{").Append("\n");
foreach (TableColumn col in tableframe.ViewItems)
{
_str.Append("public ").Append(datatype.DataTypeList[col.ColumnType].ToString()).Append(" ").Append(col.ColumnName).Append("\n");
_str.Append("{").Append("\n");
_str.Append("get;").Append("\n");
_str.Append("set;").Append("\n");
_str.Append("}").Append("\n").Append("\n");
}
_str.Append("}").Append("\n");
_str.Append("}").Append("\n");
return _str;
}
}