2012-02-09 52 views
0

我正在嘗試使用filehelpers類構建器,但我有點困惑於如何處理它。如何轉換爲動態類?

 var cb = new DelimitedClassBuilder("temp", ",") { IgnoreFirstLines = 0, IgnoreEmptyLines = true, Delimiter = "," }; 
     var sr = new StreamReader(stream); 
     var headerArray = sr.ReadLine().Split(','); 
     foreach (var header in headerArray) 
     { 
      var fieldName = header.Replace("\"", "").Replace(" ", ""); 
      cb.AddField(fieldName, typeof(string)); 
     } 

     var engine = new FileHelperEngine(cb.CreateRecordClass()); 
     var result = engine.ReadStream(sr); 

DelimitedClassBuilder發生在,因爲它是第一個參數「的className」,然後選擇‘分隔符’

// 
    // Summary: 
    //  Creates a new DelimitedClassBuilder. 
    // 
    // Parameters: 
    // className: 
    //  The valid class name. 
    // 
    // delimiter: 
    //  The delimiter for that class. 
    public DelimitedClassBuilder(string className, string delimiter); 

然後我去通過流的第一行是什麼包含什麼,我稍後會頭作爲FIELDNAMES用於此「類」。

最後一行讀取的信息的所有其餘部分並將其作爲一個對象數組[]。我裏面看它們是類「TEMP」的。

但我不知道如何將它投射到「temp」類。現在我不知道如何獲取數據。我知道我不能像

結果[0] .SomeFieldName作爲fieldName可能會從運行改變到運行。所以這也讓我想知道爲什麼如果我不得不做類似於通過索引或其他東西來獲得它的東西,那麼爲什麼它會首先創建一個類。

正如你現在所看到的,我很困惑。

+2

鑄造意味着你有編譯時的知識,編譯器不能推斷。如果你需要轉換成未知的東西,你應該改變你的設計,使用接口或繼承來統一公共邏輯。 – paislee 2012-02-09 00:16:09

+0

您使用的是什麼版本的.NET框架? – 2012-02-09 01:19:36

+0

4.0(所以我可以使用動態如果需要)。我只是感到困惑的事實,它使一個類,但我不明白該做什麼這個運行時生成的類。 – chobo2 2012-02-09 16:24:35

回答

0

最簡單的方法是in the examples

您使用

DataTable dt = engine.ReadStreamAsDT(sr); 

,然後用類似訪問結果:

foreach (DataRow row in dt.Rows) // Loop over the rows. 
{ 
    Console.WriteLine("--- Row ---"); // Print separator. 
    foreach (var item in row.ItemArray) // Loop over the columns. 
    { 
     Console.Write("Item: "); // Print label. 
     Console.WriteLine(item); 
     /// the Type of item will be whatever you defined when you 
     /// called ClassBuilder.AddField() (String in your example) 
    } 
} 
Console.ReadLine();