通过替换字符串的方式生成代码,其他代码也可以通这种方式生成
直接上代码
设置模板
将这几个模板文件设置为:嵌入资源
模板内容:
using SqlSugar;namespace {Namespace}.Domain.Admin.{ModelName};
/// <summary>
/// {TableDisplayName}
///</summary>
[SugarTable("{TableName}")]
public class {ModelName}Entity
{{AttributeList}
}
生成代码
/// <summary>/// 预览代码/// </summary>/// <param name="currentTableName">表名</param>/// <returns></returns>[HttpGet]public ProviewCodeOutput PreviewCode(string currentTableName){//我是在其他类里面生成的代码,所以通过dll加载嵌入的资源// 通过 DLL 加载资源 var assemblyPath = Path.Combine(AppContext.BaseDirectory, "XR.Host.dll");var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath);var resourceName = assembly.GetManifestResourceNames().FirstOrDefault(a => a.Contains("ModelTemplate.txt"));var file = assembly.GetManifestResourceStream(resourceName);//实体模板var modelTemplate = new StreamReader(file).ReadToEnd();//仓储接口模板var IrepostoryTemplate = new StreamReader(assembly.GetManifestResourceStream(assembly.GetManifestResourceNames().FirstOrDefault(a => a.Contains("IRepositoryTemplate.txt")))).ReadToEnd();//仓储接口模板var repostoryTemplate = new StreamReader(assembly.GetManifestResourceStream(assembly.GetManifestResourceNames().Where(a => a.Contains("RepositoryClassTemplate.txt")).First())).ReadToEnd();var orm = LazyGetRequiredService<IUserRepository>().Orm;var table = orm.DbMaintenance.GetTableInfoList(true);//命名空间var Namespace = Assembly.GetExecutingAssembly().GetName().Name;var parentPath = new DirectoryInfo(Environment.CurrentDirectory).Parent + $"\\{Namespace}";var result = new ProviewCodeOutput();foreach (var tableInfo in table){if (tableInfo.Name == currentTableName){var modelName = tableInfo.Name.Replace("SYS_", "").Replace("TB_", "").Replace("TN_", "");modelName = ConvertToCamelCase(modelName);var tableColumn = orm.DbMaintenance.GetColumnInfosByTableName(tableInfo.Name);var attributes = BuildColumn(tableColumn);//通过替换字符串的方式生成代码result.ModalCode = modelTemplate.Replace("{Namespace}", Namespace).Replace("{ModelName}", modelName).Replace("{TableName}", tableInfo.Name).Replace("{TableDisplayName}", tableInfo.Description).Replace("{AttributeList}", attributes);}}return result;}private string BuildColumn(List<DbColumnInfo> columnInfos){var attributes = new StringBuilder();foreach (var columnInfo in columnInfos){attributes.Append("\r\n /// <summary>");attributes.Append($"\r\n /// {columnInfo.ColumnDescription}");attributes.Append("\r\n /// </summary>");attributes.Append($"\r\n [SugarColumn({(columnInfo.IsPrimarykey ? "IsPrimaryKey = true," : "")} ColumnName = \"{columnInfo.DbColumnName}\", {(columnInfo.IsNullable ? "IsNullable = true," : "")} ColumnDescription = \"{columnInfo.ColumnDescription}\")]");attributes.Append($"\r\n public {SetDataType(columnInfo.DataType)}{(columnInfo.IsNullable ? "?" : "")} {ConvertToCamelCase(columnInfo.DbColumnName)} {{ get; set; }}");}return attributes.ToString();}private string SetDataType(string dataType){dataType = dataType.ToLower();var result = dataType;switch (dataType){case "int32":result = typeof(int).Name;break;case "int64":result = typeof(int).Name;break;case "datetime":result = typeof(DateTime).Name;break;}return result;}/// <summary>/// 将驼峰转换为字符串/// </summary>/// <param name="input"></param>/// <returns></returns>private string ConvertToCamelCase(string input){if (string.IsNullOrEmpty(input))return input;var text = input.Split('_');var camelTxt = "";TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo;foreach (var c in text){camelTxt += textInfo.ToTitleCase(c.ToLower());}return camelTxt;}