2009-07-10 9 views
1

私は電話したいいくつかの異なるリストを持っています。それらはすべてクラスのための同じフォーマットを持っています: id、value、description、order。たくさんのリストのすべてを返すクラスを作成する代わりに、ジェネリックを使い、返すべきリストの種類を伝えたいと思いました。しかし、私はどのようにクラスを生成するのか分かりません。ジェネリックを使用してList(t)のカスタムクラスを生成できますか?

ここに私の呼び出しコードの関数の2つの例があります。これは、リストの種類を示す必要がありますし、ストアドプロシージャは、データを取得するために使用:

Public Function getTheEyeColors() 
    Dim glEyeColors As New GenericList 
    Return glEyeColors.GetALList(Of EyeColor)("GetAllEyeColors") 
End Function 

Public Function getTheHairColors() 
    Dim glHairColors As New GenericList 
    glHairColors.GetALList(Of HairColor)("GetAllHairColors") 
End Function 

そして、ここでは、私は、一般的なリストを構築するために使用しようとしていますコードです...

Public Function GetALList(Of t)(ByVal storedproc As String) As List(Of t) 

    Dim lstGenericList As New List(Of t) 
    Dim oGenericListItem As t 
    Dim oProviderFactory As New ProviderFactory 
    Dim oConnection As DbConnection 
    Dim oReader As System.Data.IDataReader 
    Dim oFactory As DbProviderFactory 
    Dim oFileMgt As New FileMgt 
    Dim oCmd As DbCommand 

    oFactory = oProviderFactory.GetFactory 
    oConnection = oProviderFactory.GetProviderConnection(oFactory) 
    oCmd = oConnection.CreateCommand 
    oCmd.CommandType = CommandType.StoredProcedure 

    oCmd.CommandText = storedproc 

    Using (oConnection) 

     oConnection.Open() 
     oReader = oCmd.ExecuteReader() 

     While oReader.Read 
      HERE IS WHERE I AM NOT SURE HOW TO POPULATE THE EYECOLOR OR HAIRCOLOR CLASS 
      lstGenericList.Add(oGenericListItem) 
     End While 

     oConnection.Close() 

    End Using 

    Return lstGenericList 

End Function 

答えて

8

をあなたは2つの一般的な制約を加えることができます。私はVBでそれらを表現する方法を知りませんが、ここではC#のバージョンがあります:T : new()

    • -
    • T : ICommonInterfaceパラメータなしのコンストラクタが存在しなければならない - Tインタフェース

    を実装する必要がありますその後、共通のプロパティ(ID、値、説明、注文)をインターフェイスに入力すると、new T()を作成し、プロパティを設定してリストに追加することができます。

    EDIT:

    VBの構文は、それが両方作成可能でなければならないことを指定し、インターフェイスを実装するには、次のとおりです。

    • (Of T As {ICommonInterface, New})
  • +0

    +1私にそれを打つ。問題のVB構文は '(Of T As ICommonInterface)'、FYI – Welbog

    +0

    そしてパラメータのないコンストラクタ1ですか?ちょうど答えを編集して、代わりにVBの構文を含めることができます:) –

    0

    ジョンはそれを行うために推奨しています方法は、おそらくです良い方法ですが、私はDotNetNukeアーキテクチャのFillObjectメソッドを使用しています。基本的には、オブジェクトのプロパティとデータセットの値を一致させるためにリフレクションを使用する慣習に基づいたメソッドです。

    私は個人的にはこのメソッドが気に入らないのですが、ストアドプロシージャごとにオブジェクトを水和するコードの新しい実装を作成する必要はありません。

    コードは、DNNプロジェクトの全ソースダウンロードで入手できます。

    0
    While oReader.Read 
        HERE IS WHERE I AM NOT SURE HOW TO POPULATE THE EYECOLOR OR HAIRCOLOR CLASS 
    

    LinqToSql(System.Data.Linq)を参照してください。あなたはそれを再発明しているかもしれません。

    関連する問題