这是使用T4模板生成代码的一种可能的解决方案。 Visual Studio提供了T4模板。有关详细信息,请查看 文件 关于使用T4文本模板生成代码。
对于示例,我创建了一个包含Common.t4文件,该文件具有检索模型信息的功能。如果您已经有一个库,那么您可以直接在模板中导入程序集,也不需要公共代码文件。为简单起见,我只返回函数中的静态数据,然后通过调用获取数据的方法来实现它。
示例常见文件:
<#@ import namespace="System" #> <#+ public string[] GetEntities() { // TODO: implement logic to get entitities return new string[] { "Entity01", "Entity02", "Entity03" }; } public class FieldDefinition { public string Name { get; set;} public Type Type { get; set; } } public FieldDefinition[] GetEntityFields(string entityName) { // TODO: Implement retrieval of Entity fields return new FieldDefinition[] { new FieldDefinition() { Name = "Id", Type = typeof(int) }, new FieldDefinition() { Name = "Name", Type = typeof(string) } }; } #>
一旦有了这个通用功能,就可以为模型创建一个T4模板文件,为控制器创建一个。
这是一个示例模型模板:
<#@ template hostspecific="false" language="C#" #> <#@ output extension=".cs" #> <#@ include file="Common.t4" #> using System; using System.Collections.Generic; using System.Linq; namespace WebApplication3.Models { <# foreach (string entity in GetEntities()) { #> public class <#=entity#>Model { <# foreach (FieldDefinition fieldDefinition in GetEntityFields(entity)) { #> public <#= fieldDefinition.Type.FullName#> <#= fieldDefinition.Name#> { get; set; } <# } #> } <# } #> }
最后是Controllers模板:
<#@ template hostspecific="false" language="C#" #> <#@ output extension=".cs" #> <#@ include file="Common.t4" #> using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using WebApplication3.Models; namespace WebApplication3.Controllers { <# foreach (string entity in GetEntities()) { #> [Produces("application/json")] [Route("api/<#=entity#>")] public class <#=entity#>Controller : Controller { // GET: api/<#=entity#> [HttpGet] public IEnumerable<<#=entity#>Model> Get() { return new <#=entity#>Model[] { new <#=entity#>Model(), new <#=entity#>Model() }; } // GET: api/<#=entity#>/5 [HttpGet("{id}", Name = "Get")] public <#=entity#>Model Get(int id) { return new <#=entity#>Model(); } // POST: api/<#=entity#> [HttpPost] public void Post([FromBody]<#=entity#>Model value) { } // PUT: api/<#=entity#>/5 [HttpPut("{id}")] public void Put(int id, [FromBody]<#=entity#>Model value) { } // DELETE: api/<#=entity#>/5 [HttpDelete("{id}")] public void Delete(int id) { } } <# } #> }
还有许多其他商业和免费代码生成工具可用。检查此链接: 代码生成工具的比较 。如果您不喜欢它或者您缺少某些功能,这也提供了T4的替代品。
最后,我还提到了可用于在运行时中生成完全动态代码的技术。对于这种情况,您可以使用 Roslyn编译器 , CodeDOM的 要么 Reflection.Emit的 。