2009-09-01 85 views
1

我試圖創建一個導出Excel/CSV函數,它將遍歷一個自定義對象並首先輸出屬性名稱,然後輸出值。我只想在必要時使用反射,因此我試圖在輸出標題時保存屬性名稱,然後重新使用它們來打印值。遍歷自定義對象的屬性名稱和值

這可能嗎?我有點厭倦了在循環中使用反射,但有沒有更好的方法?

的僞代碼:

Dim Cust1 = New Customer("Tom", "123 Main Street") 
Dim Cust2 = New Customer("Mike", "456 Main Street") 
Dim Cust3 = New Customer("Joe", "789 Main Street") 
Dim CustList As New Arraylist() 
CustList.Add(Cust1) 
CustList.Add(Cust2) 
CustList.Add(Cust3) 

CSVExport(CustList, New Customer()) 


Function CSVExport(List As ArrayList, CustomObject as Object) As StringWriter 
Dim sw as Stringwriter 
dim proplist as arraylist 

'output header 

Foreach CustProperty as System.Reflection.PropertyInfo CustomObject.GetType().GetProperties() 
    proplist.add(CustProperty.Name) 
    sw.write(CustProperty + ",") 
EndFor 

'output body 
'?? 
'?? Here I'd like to loop through PropList and List instead of using reflection 
'?? 

Return Sw 

End Function 

回答

1

無論您是否將名稱存儲在列表中,它都會反映出來。

您是否擁有對CustomObject的控制權。您可以將信息存儲在CustomObject中,並在不使用反射的情況下查詢該信息。例如,這是我用於我的基本域對象的代碼。現在

public class DomainObject 
{ 
    private HashTable _values = new HashTable(); 

    public HashTable Properties 
    { 
     get 
     { 
      return _values; 
     } 
    } 

    protected void SetValue<T>(string property, T value) 
    { 
     if (_values.ContainsKey(property)) 
     { 
      _values[property] = value; 
     } 
     else 
     { 
      _values.Add(property, value); 
     } 
    } 

    protected T GetValue<T>(string property) 
    { 
     if (_values.ContainsKey(property)) 
     { 
      return (T)_values[property]; 
     } 
     else 
     { 
      return default(T); 
     } 
    } 
} 


public class TootsieRoll : DomainObject 
{ 
    public string Size 
    { 
     get { return GetValue<string>("Size"); } 
     set { SetValue<string>("Size",value); } 
    } 

    public string Flavor 
    { 
     get { return GetValue<string>("Flavor"); } 
     set { SetVlaue<string>("Flavor", value); } 
    } 

    public int Ounces 
    { 
     get { return GetValue<int>("Ounces"); } 
     set { SetValue<int>("Ounces", value); } 
    } 
} 

您的CSV代碼只需要它從domainObject的繼承得到的名稱和值「屬性」哈希表內通過關鍵=>值對訪問和循環。但是,顯然這隻有在您的對象需要控制級別以使它們從DomainObject繼承時纔有效,並且它不會涉及30年的drugery來重寫所有屬性訪問器。如果是這樣的話,那麼反思就是你要走的路。

0

在你的僞代碼你使用反射已經填充的ArrayList。如果你想要做的只是遍歷ArrayList,你可以看看ArrayList Class MSDN entry。它顯示瞭如何實現IEnumerable遍歷您的數組列表,e.g:

Dim obj As [Object] 

For Each obj In CType(myList, IENumberable) 
    Console.Write(" : {0}", obj) 
Next obj 

這是未經測試的是,我不知道這是否應該是CTYPE(myList中,IENumberable)或DirectCast(myList中,IENumberable)。

還有另外一種選擇,使用Object Serialization in VB.Net,這條路很少(至少在我們的辦公室周圍)。

+0

這會確保值以與屬性名稱相同的順序迭代嗎? – mga911 2009-09-01 21:34:13

+0

是的,我認爲是。我正在做一個類似的項目,我正在處理和屬性按照我傳遞給他們的順序返回。正如我所說,我發佈的代碼是未經測試的,我在C#中工作。讓我知道它是否適合你! – 2009-09-01 22:04:56