c# - 将静态数据添加到 C# 项目

标签 c#

我正在尝试设计一类静态对象。例如,假设它们代表汽车模型。这就是我开始的方式:

public class CarModel
{
    internal CarModel(string manufacturer, string modelName, double seconds0To60, double maxMPH)
    {
        Manufacturer = manufacturer;
        ModelName = modelName;
        Seconds0To60 = seconds0To60;
        MaxMPH = maxMPH;
    }
    public string Manufacturer { get; private set; }
    public string ModelName { get; private set; }
    public double Seconds0To60 { get; private set; }
    public double MaxMPH { get; private set; }

    public override string ToString() { return Manufacturer + " " + ModelName; }

    static public readonly CarModel AlfaRomeo_Brera = new CarModel("Alfa Romeo", "Brera 1.75 TBi 3d", 7.5, 146.0);

    static public readonly CarModel AlfaRomeo_Giulietta = new CarModel("Alfa Romeo", "Giulietta 1.4 TB Lusso 5d", 9.1, 121.0);

    static public readonly CarModel Ford_Focus = new CarModel("Ford", "Focus 2.5 RS 3d", 5.2, 163.0);

    static public readonly CarModel Ford_Mondeo = new CarModel("Ford", "Mondeo Saloon 2.0 Zetec 4d", 9.7, 130.0);

    static public readonly CarModel Honda_Accord = new CarModel("Honda", "Accord Tourer 2.4 i-VTEC EX 5d (Adas)", 7.6, 138.0);

    static public readonly CarModel Honda_Civic = new CarModel("Honda", "Civic Hatchback 1.8 i-VTEC Type S 3d Auto", 10.6, 127.0);
}

这种方法对于上述 6 个测试模型似乎效果很好。然而,现在看来我有大约 500 个车型需要输入,并且每个车型都有很多属性。我拥有的汽车数据当前位于 Excel 电子表格中。所以问题是如何最好地将这些数据添加到我的 dll 中?

如果可能的话,我希望将所有汽车模型编译到程序集 dll 中。所以我宁愿不使用数据库。我简要浏览了一些动态枚举帖子 - 也许一些自动代码生成可能有效?或者也许我可以将数据复制并粘贴到资源文件中?或者也许有某种方法可以将 DataSet 或 DataTable 添加到包含此静态数据的项目中?

我认为上面示例类中的静态只读属性需要更改,以获得更复杂的方法来访问模型列表。

请告诉我您的建议, 谢谢。

最佳答案

既然您说您希望将模型编译到程序集中,我会研究 T4。这是教程http://msdn.microsoft.com/en-us/library/dd820614.aspx 。基本方法是:

  1. 在 csv 中定义模型
  2. 创建一个 t4 模板,该模板读取 csv,在类顶部写入数据(内部 CarModel 等),迭代数据,为每一行写出“static public your property”

每次构建项目时,t4 模板都会运行,为您生成类。

编辑,这是一个解决问题的示例 .tt 文件:

<#@ template debug="false" language="C#" #>  
<#@ output extension=".cs" #>  
<#@ import namespace="System" #>  
<#@ import namespace="System.IO" #>  
<#@ import namespace="System.Collections.Generic" #>  
<#@ import namespace="System.Text.RegularExpressions" #>  

namespace Play.Helpers  
{

    public class CarModel
    {
        internal CarModel(string manufacturer, string modelName, double seconds0To60, double maxMPH)
        {
            Manufacturer = manufacturer;
            ModelName = modelName;
            Seconds0To60 = seconds0To60;
            MaxMPH = maxMPH;
        }
        public string Manufacturer { get; private set; }
        public string ModelName { get; private set; }
        public double Seconds0To60 { get; private set; }
        public double MaxMPH { get; private set; }

        public override string ToString() { return Manufacturer + " " + ModelName; }

        <#
        String path = "D:\\My Documents\\Visual Studio 2010\\Projects\\Play\\Play\\Content\\testdata.csv";
        List<string[]> parsedData = new List<string[]>();

                try
                {
                    using (StreamReader readFile = new StreamReader(path))
                    {
                        string line;
                        string[] row;

                        while ((line = readFile.ReadLine()) != null)
                        {
                            row = line.Split(',');
                            #>
                            static public readonly CarModel <#=(String)row[0].Replace(" ", "_")#>_<#=Regex.Replace(row[1], @"[\.\(\)-]", "_").Replace(" ", "_")#>  = new CarModel("<#=(String)row[0]#>", "<#=row[1]#>", <#=row[2]#>, <#=row[3]#>);
                            <#
                            parsedData.Add(row);
                        }
                    }
                }catch(Exception e)
                {
                    //left as an excercise for the reader
                }

        #>
    }
}

关于c# - 将静态数据添加到 C# 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7098812/

相关文章:

c# - 检索文件的创建日期 (FTP)

c# - 在没有线程锁定的情况下通过同步 c# 调用异步

C# 为 WebClient 使用代理

c# - C# 中的标准委托(delegate)

c# - 为什么 Browsable 属性使属性不可绑定(bind)?

c# - Entity Framework 代码优先 Fluent API

c# - 消息解析器 C#

c# - 编码 va_list

c# - NV12格式和UV平面

c# - 使用 LINQ to Excel 将数据从 Excel 导入到 SQL Server 数据库