2012-02-09 20 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();