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

如何在Visual Studio(C#)编译时用电子表格整理对象初始化数据?

编译时导入电子表格数据到C#类的解决方案(VS2017)

针对你用VS2017 + C#开发游戏,想把40个Car类的初始化数据从构造函数移到电子表格,且编译时导入避免分发数据文件的需求,我推荐几个实用方案,按易上手程度排序:

方案1:用T4文本模板(最推荐,VS原生支持)

T4是VS自带的代码生成工具,能在编译阶段读取外部文件(比如CSV/Excel)并生成对应的C#代码,最终程序里只有生成的类,完全不需要分发数据文件。

具体步骤:

  1. 准备数据文件:
    用CSV(比Excel更轻量,无需依赖Office)整理所有Car的属性,比如创建CarData.csv:

    CarTypeName,Speed,Weight,EnginePower
    SedanCar,120,1500,150
    SportsCar,200,1300,300
    TruckCar,80,3500,200
    // 剩下37个Car的数据依次添加
    

    如果必须用Excel,后续可以用EPPlus等库读取,CSV是更简单的选择。

  2. 创建T4模板:
    在游戏项目里添加一个T4模板文件(右键项目 → 添加 → 新建项 → 搜索“Text Template”),命名为CarGenerator.tt,替换内容为:

    <#@ template debug="false" hostspecific="true" language="C#" #>
    <#@ assembly name="System.Core" #>
    <#@ import namespace="System.IO" #>
    <#@ import namespace="System.Linq" #>
    <#@ output extension=".cs" #>
    
    namespace Game.Cars
    {
        // 定义Car基类,统一属性和构造函数
        public abstract class CarBase
        {
            public int Speed { get; }
            public int Weight { get; }
            public int EnginePower { get; }
    
            protected CarBase(int speed, int weight, int enginePower)
            {
                Speed = speed;
                Weight = weight;
                EnginePower = enginePower;
            }
        }
    
    <#
    // 读取CSV文件,路径相对于T4模板的位置
    var csvPath = Host.ResolvePath("CarData.csv");
    var lines = File.ReadAllLines(csvPath).Skip(1); // 跳过表头行
    foreach (var line in lines)
    {
        // 拆分CSV行,注意如果数据里有逗号,需要用引号包裹并调整拆分逻辑
        var parts = line.Split(',');
        var carTypeName = parts[0].Trim();
        var speed = int.Parse(parts[1].Trim());
        var weight = int.Parse(parts[2].Trim());
        var enginePower = int.Parse(parts[3].Trim());
    #>
        // 自动生成每个Car子类
        public class <#= carTypeName #> : CarBase
        {
            public <#= carTypeName #>() : base(<#= speed #>, <#= weight #>, <#= enginePower #>)
            {
            }
        }
    <#
    }
    #>
    }
    
  3. 生成代码并使用:
    保存T4模板后,VS会自动生成CarGenerator.cs文件(在模板文件下方),里面包含所有40个Car子类。你可以直接在游戏里实例化这些类,比如var mySedan = new SedanCar();,完全不需要额外数据文件。

优势:

  • 零额外依赖,VS2017原生支持
  • 数据在表格里直观编辑,修改后保存模板就自动更新代码
  • 编译时生成代码,运行时无性能开销

注意点:

  • 如果CSV数据里包含逗号,需要用双引号包裹(比如"Sports Car X",220,1250,350),并修改T4里的拆分逻辑(可以用TextFieldParser类来处理标准CSV格式)
  • 确保CSV文件的Build Action设为Content,或者调整T4里的路径指向正确位置

方案2:Roslyn代码生成器(更灵活)

如果你需要更复杂的代码生成逻辑(比如根据数据生成不同的方法),可以用Roslyn代码生成器,它能在编译阶段深度集成VS的编译流程。

大致步骤:

  1. 创建一个.NET Standard类库项目,作为代码生成器,引用Microsoft.CodeAnalysis.CSharp和Microsoft.CodeAnalysis.Analyzers NuGet包
  2. 在生成器里编写逻辑读取电子表格数据,生成Car类的语法树
  3. 在游戏项目里添加对生成器项目的引用,并在项目文件里配置代码生成器
  4. 编译时生成器会自动生成对应的C#代码

这个方案比T4更灵活,但配置稍复杂,适合有一定Roslyn基础的开发者。


方案3:嵌入资源+静态初始化(折中方案)

如果暂时不想用代码生成,也可以把数据文件嵌入到程序集里,在静态构造函数里读取并初始化Car实例的字典:

  1. 把CSV文件添加到项目,设置Build Action为Embedded Resource
  2. 编写一个静态类读取嵌入资源:
    public static class CarDataStore
    {
        public static readonly Dictionary<string, CarBase> Cars = new Dictionary<string, CarBase>();
    
        static CarDataStore()
        {
            var assembly = System.Reflection.Assembly.GetExecutingAssembly();
            var resourceName = "Game.CarData.csv"; // 注意命名空间+文件名
            using (var stream = assembly.GetManifestResourceStream(resourceName))
            using (var reader = new StreamReader(stream))
            {
                var lines = reader.ReadToEnd().Split('\n').Skip(1);
                foreach (var line in lines)
                {
                    var parts = line.Split(',');
                    var carTypeName = parts[0].Trim();
                    var speed = int.Parse(parts[1].Trim());
                    var weight = int.Parse(parts[2].Trim());
                    var enginePower = int.Parse(parts[3].Trim());
                    // 根据类型名创建实例,或者用工厂模式
                    Cars.Add(carTypeName, new CarBase(speed, weight, enginePower));
                }
            }
        }
    }
    
    不过这个方案是在程序第一次访问CarDataStore时读取数据(运行时),但数据嵌入在程序集里,不用分发额外文件。如果追求完全编译时初始化,还是前两个方案更合适。

总结

针对你的场景,T4文本模板是最适合的选择,它配置简单,VS原生支持,能完美满足你把表格数据编译时导入到C#类的需求,而且不用分发任何额外数据文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:58:32