通过替换字符串的方式生成代码,其他代码也可以通这种方式生成
直接上代码
设置模板
将这几个模板文件设置为:嵌入资源
模板内容:
csharp
using SqlSugar;
namespace {Namespace}.Domain.Admin.{ModelName};
/// <summary>
/// {TableDisplayName}
///</summary>
[SugarTable("{TableName}")]
public class {ModelName}Entity
{
{AttributeList}
}
生成代码
csharp
/// <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;
}