2014-02-25 60 views
2

我是新來的在C#中使用動態對象。我正在讀取與此處找到的代碼非常相似的CSV文件:http://my.safaribooksonline.com/book/programming/csharp/9780321637208/csharp-4dot0-features/ch08lev1sec3C#Linq到CSV動態對象運行時列名

我可以引用靜態名稱所需的數據,但是我找不到在運行時使用動態名稱引用的正確語法。

比如我有:

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

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

如果你知道 「SomeColumn」 這名工作正常。我寧願將列名稱作爲字符串,並且能夠在運行時進行相同的類型引用。

+0

聽起來像是你會更好,只是將數據加載到一個'DataTable'。 – Servy

+0

你想在運行時決定列名嗎? –

+0

我確實想在運行時決定列名。作爲文件名的想法可以通過列傳遞給函數,並且可以從那裏引用數據。 – raholling

回答

2

由於人們必須創造出從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. 
0

試試這個

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

我收到「無法對空引用執行運行時綁定」。 rec.SomeColumn仍然有效。 – raholling

+0

你檢查過列名是否正確? – Andrew

+0

是的。如果我使用語法「rec.SomeColumn」,我會得到數據,但如果我嘗試使用帶有「SomeColumn」字符串的建議代碼,則會出現聲明錯誤。 – raholling

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)); 

} 
相關問題