【问题标题】:vb.net List of dynamic typevb.net 动态类型列表
【发布时间】:2012-08-04 11:55:08
【问题描述】:

我正在为我的程序的一部分构建一个 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 pType) 而不是 List(Of Object)。

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

那么有没有办法返回 List(Of MyModel'sType) ?

提前致谢!

【问题讨论】:

  • Dim x As T = New T() 可以(并且应该)缩短为Dim x As New T()
  • 好吧,我是一名前 Java 编码员,我会记住这一点,谢谢。

标签: vb.net list generics dynamic types


【解决方案1】:

只需使用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 不同,具有 reified generic types,因此您可以从类型参数创建实例。

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

【讨论】:

    【解决方案2】:

    忽略 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
    

    【讨论】:

    • +1,但您可能需要先将 Activator.CreateInstances 返回值转换为 T(如果您使用 Option Strict,您应该这样做)。
    • 感谢 Heinzi 100% 正确,我在浏览器中编辑了这个,所以错过了那个。 (编辑,使用 T 时好像不能通过婴儿车?msdn.microsoft.com/en-us/library/0hcyx2kd.aspx
    • 好吧,这个函数可以工作,但现在我遇到了 BindingSource 的一些问题......但这是另一回事......但如果你想随意说出为什么它不应该工作,因为这对我来说似乎还不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2021-01-04
    • 2011-01-29
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多