vb.net动态类型列表

时间:2012-08-07 12:51:37

标签: vb.net list generics dynamic types

我正在为我的程序的一部分构建MVC结构。

我已经完成了5-10个表的模型,它们的共同点只是构造函数。 (取记录集。字段)

这是我填充这些对象的功能:

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 pType)而不是List(Of Object)。

我想要这个的原因是在我的datagridviews中有标题,即使它们是空的。

那么有没有办法返回List(Of MyModel的类型)?

提前感谢!

2 个答案:

答案 0 :(得分:2)

只需使用As pType代替As Object(但考虑使用传统的类型参数名称,即T而不是pType),删除现已过时的{{1} }参数,并使用以下命令创建和添加实例:

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)实例。由于VB与Java不同,因此可以使用reified generic types创建类型参数的实例。

除此之外,请注意.NET具有与Java不同的代码样式约定;例如,所有方法都应该使用PascalCase,而不是camelCase。和Java一样,不鼓励使用匈牙利表示法。使用简洁但描述性的名称。而且,正如Rene所说,您的代码存在SQL注入漏洞。

答案 1 :(得分: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