C#Linq到CSV动态对象运行时列名

时间:2014-02-25 19:41:31

标签: c# .net dynamic .net-4.5

我是C#中使用动态对象的新手。我正在阅读与以下代码类似的CSV文件:http://my.safaribooksonline.com/book/programming/csharp/9780321637208/csharp-4dot0-features/ch08lev1sec3

我可以使用静态名称引用我需要的数据,但是在运行时使用动态名称无法找到正确的语法引用。

例如我有:

var records = from r in myDynamicClass.Records select r;

foreach(dynamic rec in records)
{
     Console.WriteLine(rec.SomeColumn);
}

如果你知道“SomeColumn”这个名字,这个工作正常。我希望列名是字符串,并且能够在运行时生成相同类型的参考。

3 个答案:

答案 0 :(得分:3)

由于必须创建一个继承自DynamicObject的类,只需在类中添加一个索引器即可通过字符串获得结果。

以下示例使用书籍示例中的相同属性,包含具有列名的各个行数据的属性。下面是该类的索引器,以实现结果:

public class myDynamicClassDataLine : System.Dynamic.DynamicObject
{ 
   string[] _lineContent; // Actual line data
   List<string> _headers; // Associated headers (properties)

   public string this[string indexer]
   {
      get 
      {
         string result = string.Empty;
         int index = _headers.IndexOf(indexer);

         if (index >= 0 && index < _lineContent.Length)
            result = _lineContent[index];

         return result;
      }

  }
}

然后访问

等数据
var csv = 
@",,SomeColumn,,,
ab,cd,ef,,,";  // Ef is the "SomeColumn"

var data = new myDynamicClass(csv); // This holds multiple myDynamicClassDataLine items

Console.WriteLine (data.OfType<dynamic>().First()["SomeColumn"]); // "ef" is the output.

答案 1 :(得分:1)

您需要使用反射。获取您将使用的名称:

List<string> columnNames = new List<string>(records.GetType().GetProperties().Select(i => i.Name));

然后,您可以遍历结果并输出每列的值,如下所示:

foreach(dynamic rec in records)
{
    foreach (string prop in columnNames)
         Console.Write(rec.GetType().GetProperty (prop).GetValue (rec, null));

}

答案 2 :(得分:0)

试试这个

string column = "SomeColumn";
var result = rec.GetType().GetProperty (column).GetValue (rec, null);