我正在为我的程序的一部分构建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的类型)?
提前感谢!
答案 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