推断类类型的共享函数,可以在列表中返回

时间:2017-12-22 18:09:10

标签: vb.net

我想创建一个返回类类型实例列表的共享函数。目前这是我的代码看起来像

class MyClass
    Implements BusinessObject
    Shared Function LoadAll(Of T As {BusinessObject, New})() As IEnumerable(Of T)
            Dim helper = New SQLHelper()
            Return helper.LoadDataTableFromDatabase("LoadTable", LoadAllProcedureName).Rows.Cast(Of DataRow).Select(Function(s) New T().FillDataRow(Of T)(s))
    End Function
End Class

class MyDerivedClass Implements MyClass
End MyClass

当我去使用它时,我必须像这样使用它:

MyDerivedClass.LoadAll(Of MyDerivedClass)()

我希望能够推断出类型,而不必使用(Of MyDerivedClass),以便我的代码看起来像MyDerivedClass.LoadAll()

我将非常感谢您为实现这一目标所缺少的任何帮助或关键字。

1 个答案:

答案 0 :(得分:1)

这是一个扩展方法,它(理论上)适用于您定义的任何类:

Public Module Module1

    <Extension()> _
    Public Function LoadAll(Of T As {BusinessObject, New})(ByVal x As T) As IEnumerable(Of T)
        Dim LoadAllProcedureName As String = "LoadAllProcedure"
        Dim helper = New SQLHelper()
        Return helper.LoadDataTableFromDatabase("LoadTable", LoadAllProcedureName).Rows.Cast(Of DataRow).Select(Function(s) New T().FillDataRow(Of T)(s))               
    End Function

    Public Sub Main()

        Dim dC As New DerivedClass()
        Dim allDc As IEnumerable(Of DerivedClass) = dC.LoadAll()

        '::: Somewhat shorter syntax
        Dim allDC As IEnumerable(Of DerivedClass) = (New DerivedClass()).LoadAll()

    End Sub

End Module

但是,正如其他人所指出的那样,这并没有真正为你清理任何东西。更重要的是,您必须在您使用枚举(Of DerivedClass)填充的任何变量中键入DerivedClass,不是吗?

据我所知,你不能拥有Shared扩展方法 - 如果你认为这是可行的方法。