VB.NET: How to handle the type of a variable (parameter & return value)?

Is it possible to replace these two functions

Function f1 (s As String) As class1()
  Dim a() As String = Split(s)
  Dim b(UBound(a)) As class1
  For i As Integer = 0 To UBound(a)
    b(i) = New class1(a(i))
  Next
  f1 = b
End Function

and

Function f2 (s As String) As class2()
  Dim a() As String = Split(s)
  Dim b(UBound(a)) As class2
  For i As Integer = 0 To UBound(a)
    b(i) = New class2(a(i))
  Next
  f2 = b
End Function

with a common function, something like

Function fGeneric (s As String,T As Type) As T()
  Dim a() As String = Split(s)
  Dim b(UBound(a)) As T
  For i As Integer = 0 To UBound(a)
    b(i) = New T(a(i))
  Next
  fGeneric = b
End Function

?

Decision

Class class1
  Private _Name As String
  Public ReadOnly Property Name As String
    Get
      Name = _Name
    End Get
  End Property
  Sub New(s As String)
    _Name = s
  End Sub
End Class

Function fGeneric(Of T) (s As String) As IEnumerable(Of T)
  Dim a() As String = Split(s)
  Dim b(UBound(a)) As T
  For i As Integer = 0 To UBound(a)
    b(i) = GetType(T).InvokeMember( _
      Nothing, _
      BindingFlags.DeclaredOnly Or _
      BindingFlags.Public Or _
      BindingFlags.NonPublic Or _
      BindingFlags.Instance Or _
      BindingFlags.CreateInstance, _
      Nothing, _
      Nothing, _
      New Object(){a(i)} _
    )
  Next
  fGeneric = b
End Function

Response.Write(fGeneric(Of class1)("a b c")(1).Name) exits b

+2
source share
3 answers
Function fGeneric(Of T) (ByVal s As String, ByVal createT As Func(Of String, T)) As IEnumerable(Of T)
  Return Split(s).Select(Function(a) createT(a))
End Function

name it like that

fGeneric(Of class1)("some, string, value", Function(a) Return New class1(a))
+3
source

As @Joel points out, this can be elegantly resolved with linq, but in order to stay close to the @ ic3b3rg question, the syntax would be as follows:

Function fGeneric(Of T As New) (s As String, createT As Func(Of String, T)) As T()
  Dim a() As String = Split(s)
  Dim b(UBound(a)) As T
  For i As Integer = 0 To UBound(a)
    b(i) = createT(a(i))
  Next
  fGeneric = b
End Function

fGeneric(Of class1)("some, string, value", Function(a) Return New class1(a))

Edit

Looking closer, I don’t think it will work, because we never said what Tcan be built from String. We just said what Tyou can create with new. I don't know how to solve it ... any suggestions are welcome (feel free to edit).

+2
source

. , .

0

All Articles