2009-05-12 13 views
1

私はDALのオブジェクトのジェネリックコレクションを作成しようとしていますが、実際にはプロダクションコードではありません。私の問題は、渡された型のReadメソッド(クラスが実装するインターフェイスの一部)を使用したいということです。ジェネリックコレクションのロード汎用タイプ

new Tを作成することはできません。そのため、オブジェクトのインスタンスは使用できません。ベースオブジェクトの子によって指定された読み取りメソッドが必要なので、ベースタイプとして宣言できません。

これは実際に可能ですか、間違ったツリーを吠えていますか?

public class ItemDictionary<T> where T : ILoadable, DataItem 
{ 

    public void Load() 
    { 
     using (IDataReader reader = SqlHelper.ExecuteReader(_connection, CommandType.StoredProcedure, _proc)) { 
      Read(reader); 
     } 
    } 

    bool Read(IDataReader reader) 
    { 
     while (reader.Read) 
     { 
      T item = default(T);   //Here be the problem 

      if (item.Read(reader)) 
      { 
       this.Add(item.Guid, item); 
      } 
     } 

     return true; 
    } 

} 

public class ExampleObject : DataItem, ILoadable 
{ 

    bool Read(IDataReader reader) 
    { 
     _var1 = reader.getString(0); 
     _var2 = reader.getString(1); 
     _var3 = reader.getString(2); 

     return true; 
    } 
} 

答えて

3

あなたがコレクションで開催されたタイプ(複数可)上のデフォルトコンストラクタを持っているし、ここで、Tに新しい()ディレクティブを追加することはできません:ディレクティブ?

その後、
public class ItemDictionary<T> where T : ILoadable, DataItem, new() 

と: -

T item = new T(); 
+0

私は行方不明でした! VB.netでも働いています:) – Pondidum

1

それはあなたが(T上の適切な制約を持つ)new T()を使用することはできません理由私にははっきりしません。明示的なインターフェイス実装を使用している理由と、なぜILoadableインターフェイスにILoadableというメソッドがあるのか​​はわかりません。

オブジェクト型にパラメータのないコンストラクタがあると必ずしも保証されないという問題はありますか?その場合は、確かにの何かを作成してTのインスタンスを作成する必要があります。そして、あなたは自分のItemDictionary<T>コンストラクタにIFactory<T>実装を渡すことができ

public interface IFactory<T> 
{ 
    // Roughly matching your current API 
    bool TryRead(IDataReader reader, out T); 

    // Simpler if you can just throw an exception on error 
    T Read(IDataReader reader); 
} 

:おそらく、あなたが実際におそらく別のインターフェイスで、工場からTを分離する必要があります。

+0

申し訳ありません、このフォームをvb.netに変換して、オンラインでコードを変換しています... – Pondidum

関連する問題