2011-08-17 72 views
2

我想设计一个静态对象的类。例如,让我们假设他们代表汽车模型。这是我开始的方式:将静态数据添加到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添加到包含此静态数据的项目中?

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

请让我知道您的建议, 谢谢。

+3

查找到资源。您可以为每辆汽车设置一个资源字符串,并从启动时实例化对象。 –

+3

您可以将数据从Excel导出为CSV格式,并将该文件作为资源添加到您的程序集。然后,您可以使用CSV阅读器从资源运行时加载数据。 – dtb

+0

我同意使用外部文件,这应该可以很容易地更新,而无需更改应用程序中的任何代码 – ScruffyDuck

回答

2

既然你说过你希望模型被编译进程序集,我会考虑T4。这里是一个教程http://msdn.microsoft.com/en-us/library/dd820614.aspx。其基本做法是:

  1. 在CSV
  2. 创建一个T4模板,读取CSV定义你的模型,在类的顶部(内部CarModel等)写入数据,通过数据迭代,为每条线写出“静态公开你的财产”

每当你建立你的项目,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

将模型放入somesort文件中,并将该文件作为内容添加到项目中。构建时,将文件复制到目标目录。文件格式可以是固定宽度,XML,CSV或其他格式。当DLL加载时,加载将成为所有车型的文件。

我会放弃静态变量的方法。

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