2009-09-01 4 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をある程度制御できますか。カスタムオブジェクト内に情報を格納し、代わりにリフレクションを使わずにその情報を照会することができます。たとえば、これは私の基本的なドメインオブジェクトに使用するコードです。

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年の製薬企業があなたのすべてのプロパティアクセサーを書き直す必要がない場合にのみ機能します。そうであれば、反射があなたの道です。

0

すでにリフレクションを使用してのArrayListを移入しています。 ArrayListをループしたいだけなら、ArrayList Class MSDN entryを見ることができます。それは例えば、あなたの配列リストを反復するためにIEnumerableをを実装する方法を示しています。

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

+0

はい、そうだと思います。私は、私が取り組んでいるプロジェクトで同様のことをやっています。プロパティを渡したのと同じ順序で返します。私が言ったように、私が投稿したコードはテストされていません。それがあなたのために働くかどうか私に教えてください! –

関連する問題