2009-09-01 3 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 년간의 마약 중독자가 모든 속성 접근자를 다시 작성할 필요가 없습니다. 그렇다면 리플렉션을 사용하는 것이 좋습니다.

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

예, 그렇게 생각합니다. 내가하고있는 프로젝트에서 비슷한 일을하고 있어요. 속성을 전달한 것과 같은 순서로 속성이 반환되었습니다. 내가 말했듯이, 내가 게시 한 코드는 테스트되지 않았으므로 C#으로 작업합니다. 그것이 당신을 위해 일하는 경우 알려주십시오! –

관련 문제