VB.NET:如何处理变量类型(参数和返回值)?

VB.NET:如何处理变量类型(参数和返回值)?,.net,vb.net,.net,Vb.net,是否可以替换这两个功能 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 及 有一个泛型函数,比如 Function fGeneric (s As String,T

是否可以替换这两个功能

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

有一个泛型函数,比如

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
?

解决方案

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(属于类别1)(“abc”)(1.Name)
输出
b

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
这样说吧

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

正如@Joel指出的,这可以用linq优雅地解决,但是为了接近@ic3b3rg的问题,语法应该是:

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))
编辑


仔细看一看,我认为这是行不通的,因为我们从来没有说过
t
可以用
字符串构建。我们只说过
T
可以通过
new
创建。我不知道怎么解决它。。。欢迎提出任何建议(请随意编辑)。

查看。我认为它可以帮助您获得与您的示例更密切相关的结果。

I get
参数不能传递给用于类型参数的“New”。
on
b(I)=New T(a(I))
I get
未定义类型“Func”。
在第一行。@ic3b3rg您至少需要.Net 3.5
Func
位于系统命名空间中。我将应用程序的池更改为
ASP.NET v4.0
,并尝试将服务器.NET版本更改为4.0.30319,但遇到问题。。。首先是在不存在的
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ASP.NET临时文件
上出现无写访问错误。。。我创建并添加了权限,但现在我得到
无法加载文件或程序集'System.Runtime,Version=4.0.0.0…
。好像我遗漏了什么-想法?好吧,我必须安装.NET4。。。现在我在调用fGeneric时得到了所需的
表达式
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))