2011-08-17 5 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에 컴파일하고 싶습니다. 그래서 나는 데이터베이스를 사용하지 않기를 바랄 것이다. 몇 가지 동적 enum 게시물에 대해 간략하게 살펴 보았습니다. 자동 코드 생성이 효과가 있을지도 모릅니다. 아니면 데이터를 복사하여 리소스 파일에 붙여 넣을 수 있습니까? 아니면이 정적 데이터가 포함 된 프로젝트에 DataSet 또는 DataTable을 추가 할 수 있습니까?

위의 예제 클래스에서 정적 읽기 전용 속성은 모델 목록에 액세스하는보다 복잡한 방법으로 변경해야한다고 생각합니다.

제안 사항을 알려주십시오. 감사합니다.

+3

봐 :

편집, 여기에 문제를 해결하는 샘플 .TT 파일입니다. 각 자동차에 리소스 문자열을 설정하고 시작할 때 해당 객체를 인스턴스화 할 수 있습니다. –

+3

Excel에서 CSV로 데이터를 내보내고 해당 파일을 리소스로 어셈블리에 추가 할 수 있습니다. 그런 다음 CSV 판독기를 사용하여 리소스에서 런타임에 데이터를로드 할 수 있습니다. – dtb

+0

외부 파일 사용에 동의합니다. 응용 프로그램의 코드를 변경하지 않고도 쉽게 업데이트 할 수 있습니다. – ScruffyDuck

답변

2

모델을 어셈블리로 컴파일하는 것을 선호한다고 말했기 때문에 T4를 살펴볼 것입니다. 다음은 자습서 http://msdn.microsoft.com/en-us/library/dd820614.aspx입니다. 기본적인 접근 방식이다 :

  • csv로 읽는 T4 템플릿을 생성 CSV
  • 에서 모델을 정의

    1. , 클래스의 상단 (내부 CarModel 등)에 데이터를 기록 데이터를 반복, 각 줄에 대해 "정적 공개 속성"을 작성하십시오.

    프로젝트를 빌드 할 때마다 t4 템플릿이 실행되어 클래스가 생성됩니다. 자원에

    <#@ 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이로드되면 모든 자동차 모델이 될 파일을로드하십시오.

    정적 변수 접근 방식을 사용하지 않을 것입니다.

    manufactuer 및 모델에 대한 열거 형을 사용할 수 있지만 새로운 제조업체 및 모델에서는 코드를 변경해야합니다.

    관련 문제