You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# T4模板遍历枚举值失败,需引用System.Runtime程序集

解决T4模板遍历枚举生成TypeScript的错误及替代方案

一、修复T4模板的System.Runtime引用问题

你遇到的错误是因为.NET 8中System.Enum类型定义在System.Runtime程序集里,而你的T4模板未引用该程序集。按以下步骤修正:

  1. 添加System.Runtime程序集引用
    在现有assembly指令后添加:
<#@ assembly name="System.Runtime" #>

若直接引用找不到,可指定完整路径(根据你的.NET安装路径调整):

<#@ assembly name="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.0\System.Runtime.dll" #>
  1. 修正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模板的环境问题难以排查,用控制台程序实现更可控,步骤如下:

  1. 创建.NET 8控制台项目,引用包含目标枚举的项目(或直接添加枚举所在DLL的引用)。

  2. 编写反射生成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());
        }
    }
}
  1. 运行控制台程序即可生成符合要求的TypeScript枚举文件,还可扩展支持多枚举批量生成、自定义输出路径等功能。

内容的提问来源于stack exchange,提问作者IFrank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:07:04