1

プログラムの一部の MVC 構造を構築しています。

私は 5 ~ 10 個のテーブルのモデルを作成しましたが、それらに共通しているのはコンストラクターのみです。(recordset.fields を取ります)

これらのオブジェクトを埋める私の関数は次のとおりです。

Public Function reqTable(ByVal pTable As String, ByVal pType As Type, ByVal pNoProjet As Integer, Optional ByVal strAdditionnalConditions As String = "") As List(Of Object)
    Dim lstRetour As List(Of Object) = New List(Of Object)

    rsRequestCSV = conSQL.Execute("SELECT * FROM " & pTable & " WHERE NoProjet = " & pNoProjet & " " & strAdditionnalConditions)
    With rsRequestCSV
        While Not .EOF
            lstRetour.Add(Activator.CreateInstance(pType, New Object() {rsRequestCSV.Fields})) 'New clsTable(rsRequestCSV.Fields))
            .MoveNext()
        End While
    End With
    Return lstRetour
End Function

私が達成できないのは、List(Of Object) の代わりに List(Of pType) を返すことです。

これが必要な理由は、空の場合でも datagridviews にヘッダーを含めるためです。

List(Of MyModel'sType) を返す方法はありますか?

前もって感謝します!

4

2 に答える 2

2

As pTypeの代わりに使用As Objectして (ただし、従来の型引数名を使用することを検討してください。つまり、Tの代わりにpType)、廃止されたpType引数を削除し、次を使用してインスタンスを作成および追加します。

Public Function ReqTable(Of T)(ByVal table As String, ByVal noProject As Integer, Optional ByVal additionalConditions As String = "") As List(Of T)
    Dim result As New List(Of T)()

    ' Where is this declared?! It probably should be declared here.
    request = conSQL.Execute( _
        String.Format("SELECT * FROM {0} WHERE NoProjet = {1} {2}", _
                      table, noProjet, additionnalConditions))

    While Not request.EOF
        result.Add( _
            CType(Activator.CreateInstance( _
                    GetType(T), New Object() {request.Fields}), _
                T))
        request.MoveNext()
    End While

    Return result
End Function

GetTpe(T)System.Type型引数を表すインスタンスを取得します。VB は Java とは異なり、ジェネリック型を具体化しているため、型引数からインスタンスを作成できます。

それとは別に、.NET には Java とは異なるコード スタイル規則があることに注意してください。たとえば、すべてのメソッドはキャメルケースではなくパスカルケースを使用する必要があります。また、Java と同様に、ハンガリー語表記の使用はお勧めできません。簡潔でわかりやすい名前を使用してください。そして、Rene が指摘したように、あなたのコードは SQL インジェクションの脆弱性に悩まされています。

于 2012-08-07T13:32:03.350 に答える
1

SQLインジェクションの問題を無視して、これを試してください:

Public Function reqTable(of T)(ByVal pTable As String, ByVal pNoProjet As Integer, Optional ByVal strAdditionnalConditions As String = "") As List(Of T)
    Dim lstRetour As New List(Of T)

    rsRequestCSV = conSQL.Execute("SELECT * FROM " & pTable & " WHERE NoProjet = " & pNoProjet & " " & strAdditionnalConditions)
    With rsRequestCSV
        While Not .EOF
            lstRetour.Add(Activator.CreateInstance(T, New Object() {rsRequestCSV.Fields})) 'New clsTable(rsRequestCSV.Fields))
            .MoveNext()
        End While
    End With
    Return lstRetour
End Function
于 2012-08-07T13:07:34.850 に答える