방법

2011-01-12 6 views
0

에 일반 독자를 전달 내가 가진 방법방법

public Customer InitializeCustomer (reader) 
{ 
     Customer customer =new Customer(); 

     customer.CompanyName = reader[1].ToString(); 

     customer.Address1 = reader[2].ToString(); 

     customer.Address2 = reader[3].ToString(); 

     customer.City = reader[4].ToString(); 

     customer.State = reader[5].ToString(); 

     customer.Zip = reader[6].ToString(); 
} 

이 방법은 동일합니다. 하지만 문제는 InitializeCustomer 'reader'에 대한 매개 변수가 내가 읽는 파일 유형에 따라 달라집니다. 나는 xls 파일과 다른 시간에 CSV 등에서 데이터를 읽어야 할 때가있다. 나는 다른 리더로 메소드 오버로드를 가질 수있다. 하지만 oledbreader, streamreader 등의 모든 유형의 리더에서 작동 할 수있는 한 가지 방법이 가능합니다.

미리 감사드립니다.

+0

이러한 클래스는 모두 무엇부터 파생됩니까? –

+0

고객이 프로그램에 정의 된 클래스입니다. 상속은 사용되지 않았습니다. – Sandeep

+0

'reader' 유형이란 무엇입니까? –

답변

2

, 당신은 단지 dynamic을 사용할 수 있습니다 코드 구조가 좋으므로이 메서드를 속한 Customer 클래스로 옮기는 것이 좋습니다. 예 :

public static Customer FromReader(dynamic reader) 
{ 
    Customer customer = new Customer(); 

    // Automatically calls the [1] indexer for whatever class reader is 
    customer.CompanyName = reader[1].ToString(); 
    // ... 

    return Customer; 
} 

[...] 

var customer = Customer.FromReader(myDbReader); 
1

독자가 공통 기본 클래스 또는 인터페이스를 가지고있는 한 완전히 가능합니다. 예를 들어 StringReaderStreamReader은 모두 TextReader입니다. 따라서 TextReader의 멤버 만 사용해야하는 경우 매개 변수의 유형을 지정해야합니다. 그러나 다른 독자가 다르게 사용해야하는 다른 인터페이스를 노출하는 경우 운이 없으며 여러 번 과부하가 필요합니다. 둘 중 어느 쪽이든 다른 독자를위한 래퍼를 제공하여 메소드에 대한 공통 인터페이스를 제공해야합니다. 불행히도 StreamReaderOleDbReader은 공통점이 거의 없으므로 이해할 수 있습니다.

public Customer InitializeCustomer (dynamic reader) 
{ 
    Customer customer = new Customer(); 

    // Automatically calls the [1] indexer for whatever class reader is 
    customer.CompanyName = reader[1].ToString(); 
    // ... 

    return Customer; 
} 

추신 : 당신이 사용하게 모든 독자는 색인 연산자 (대괄호)를 사용하는 일이 있다면