2011-08-17 46 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加載時,加載將成爲所有車型的文件。

我會放棄靜態變量的方法。

您可以使用枚舉製造商和型號,但新的製造商和型號需要更改代碼。