C# T4模板遍历枚举值失败,需引用System.Runtime程序集
解决T4模板遍历枚举生成TypeScript的错误及替代方案
一、修复T4模板的System.Runtime引用问题
你遇到的错误是因为.NET 8中System.Enum类型定义在System.Runtime程序集里,而你的T4模板未引用该程序集。按以下步骤修正:
- 添加
System.Runtime程序集引用
在现有assembly指令后添加:
<#@ assembly name="System.Runtime" #>
若直接引用找不到,可指定完整路径(根据你的.NET安装路径调整):
<#@ assembly name="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.0\System.Runtime.dll" #>
- 修正TypeScript枚举生成格式
原模板生成的TS枚举缺少名称和标准键值对格式,调整后完整代码示例:
<#@ template language="C#" hostspecific="true" debug="false" compileroptions="/langversion=latest" #> <#@ assembly name="System" #> <#@ assembly name="System.Core" #> <#@ assembly name="System.Runtime" #> <#@ assembly name="MyNamespace.Project\bin\Debug\net8.0\MyNamespace.Project.dll" #> <#@ import namespace="System" #> <#@ import namespace="System.Reflection" #> <#@ import namespace="System.Linq" #> <#@ output extension=".ts" #> export enum MyEnum { <# var enumType = typeof(MyNamespace.Project.MyEnum); // 枚举需指定完整命名空间 var values = Enum.GetValues(enumType).Cast<Enum>(); var isFirst = true; foreach (var value in values) { if (!isFirst) WriteLine(","); isFirst = false; var name = Enum.GetName(enumType, value); var intValue = Convert.ToInt32(value); Write($" {name} = {intValue}"); } #> }
二、控制台程序替代方案实现步骤
若T4模板的环境问题难以排查,用控制台程序实现更可控,步骤如下:
创建.NET 8控制台项目,引用包含目标枚举的项目(或直接添加枚举所在DLL的引用)。
编写反射生成TS枚举的代码:
using System; using System.IO; using System.Reflection; using System.Linq; namespace EnumGenerator { class Program { static void Main(string[] args) { var enumType = typeof(MyNamespace.Project.MyEnum); var enumName = enumType.Name; var sb = new System.Text.StringBuilder(); sb.AppendLine($"export enum {enumName} {{"); var values = Enum.GetValues(enumType).Cast<Enum>(); var isFirst = true; foreach (var value in values) { if (!isFirst) sb.AppendLine(","); isFirst = false; var name = Enum.GetName(enumType, value); var intValue = Convert.ToInt32(value); sb.Append($" {name} = {intValue}"); } sb.AppendLine("\n}"); // 写入TS文件,路径可自定义 File.WriteAllText(@"C:\YourOutputPath\MyEnum.ts", sb.ToString()); } } }
- 运行控制台程序即可生成符合要求的TypeScript枚举文件,还可扩展支持多枚举批量生成、自定义输出路径等功能。
内容的提问来源于stack exchange,提问作者IFrank
相关产品推荐
相关产品推荐

