方法

2011-01-12 2 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などのような任意のタイプのリーダーのために働く1つの方法を持つことは可能ですか?

ありがとうございます。

+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; 
} 

P.S.:あなたが使用して終了すべての読者は、インデックス演算子(角括弧)を使用してしまった場合