向c#项目中添加静态数据

本文关键字:静态 数据 添加 项目 | 更新日期: 2023-09-27 18:06:00

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

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。所以我不喜欢使用数据库。我简要地看了一下一些动态枚举帖子——也许一些自动代码生成可以工作?或者我可以将数据复制粘贴到资源文件中?或者也许有某种方式来添加一个数据集或数据表的项目,包含这个静态数据?

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

请告诉我你的建议。谢谢。

向c#项目中添加静态数据

既然您说您更喜欢将模型编译到程序集中,那么我将查看T4。这里有一个教程http://msdn.microsoft.com/en-us/library/dd820614.aspx。基本的方法是:

  1. 在csv
  2. 中定义模型
  3. 创建一个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
                }
        #>
    }
}

将模型放入某种类型的文件中,并将该文件作为内容添加到项目中。在构建时,将文件复制到目标目录。文件格式可以是固定宽度、XML、CSV或任何更简单的格式。当dll加载时,加载文件将是所有的汽车模型。

我将放弃静态变量方法。

您可以为制造商和型号使用枚举,但是新的制造商和型号将需要更改代码。