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

时间:2011-08-17 20:11:03

标签: 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添加到包含此静态数据的项目中?

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

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

2 个答案:

答案 0 :(得分:2)

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

  1. 在csv中定义您的模型
  2. 创建一个读取csv的t4模板,将数据写入类的顶部(内部CarModel等),遍历数据,为每行写出“static public your property”
  3. 每次构建项目时,都会运行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
                    }
    
            #>
        }
    }
    

答案 1 :(得分:1)

将模型放在somesort的文件中,并将文件作为Content添加到项目中。构建时,将文件复制到目标目录。文件格式可以是固定宽度,XML,CSV或任何格式更容易。加载DLL时,加载将成为所有汽车模型的文件。

我会放弃静态变量方法。

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