如何通过NSwag从OpenAPI规范生成带计算属性的C#客户端代码
NSwag生成C#计算只读属性的解决方案
方案一:OpenAPI扩展字段 + 自定义NSwag模板
先在OpenAPI规范里给目标属性加自定义扩展字段,标记它是计算属性并定义逻辑:
components: schemas: YourModel: type: object properties: Id1: type: string Id2: type: string Id3: type: string Id: type: string readOnly: true x-calculated-property: expression: "Id1 + Id2 + Id3"
然后修改NSwag的C#类模板(通常是Class.tt),在生成属性的逻辑里加入对这个扩展字段的判断:
foreach (var property in Properties) { if (property.ExtensionData.ContainsKey("x-calculated-property")) { var calcExpr = ((JObject)property.ExtensionData["x-calculated-property"])["expression"].ToString(); #> public string <#= property.Name #> { get { return <#= calcExpr #>; } } <#+ } else { // 保留原有的普通属性生成逻辑 } }
注意:模板里需要引用Newtonsoft.Json.Linq来解析扩展字段的JSON数据。
方案二:C#部分类扩展
这是最省心的方案——NSwag生成的类默认是partial类,直接在同一个命名空间下新建一个部分类文件,手动添加计算属性:
// 手动创建的YourModel.partial.cs namespace YourNamespace { public partial class YourModel { public string Id { get { return Id1 + Id2 + Id3; } } } }
后续重新生成NSwag代码时,不会覆盖这个手动添加的部分类,计算属性逻辑可以独立维护。唯一缺点是这个属性不会出现在OpenAPI文档里,如果需要对外暴露文档的话不适用。
方案三:生成后代码注入
用NSwag的post-process机制,在代码生成完成后自动插入计算属性。比如写个PowerShell脚本:
# inject-calculated-property.ps1 $file = "生成的YourModel.cs文件路径" $code = Get-Content $file -Raw $calcProperty = @" public string Id { get { return Id1 + Id2 + Id3; } } "@ $updatedCode = $code.Replace("}", "$calcProperty`r`n}") Set-Content $file $updatedCode
然后在NSwag配置文件(nswag.json)里指定这个脚本:
{ "codeGenerators": { "csharp": { "postProcess": "powershell.exe -ExecutionPolicy Bypass -File inject-calculated-property.ps1" } } }
这种方式适合批量处理多个类,但要注意脚本需要适配生成代码的结构,一旦NSwag生成的代码格式变化,脚本可能失效。
内容的提问来源于stack exchange,提问作者Kevin James
相关产品推荐
相关产品推荐

