将几个不同类中的1个作为参数传递给函数

时间:2017-01-25 16:15:10

标签: vb.net

我有几个类用sub定义数据结构,将值添加为string()。

e.g。

class A
  public property a1 as string
  public property b1 as integer
 Public sub Add(Input as String())
  a1 = input(0)
  b1 = input(1)
 end sub
end class 

class B
  public property c2 as integer
  public property d2 as string
  public property e2 as string
 Public sub Add(Input as String())
  c2 = input(0)
  d2 = input(1)
  e2 = input(2)
 end sub
end class 

我希望能够将类a或类b传递给函数,以用作List(of t)中的类型。

e.g。

List(of A) = Function_C(PathToFile, A)
or
List(of B) = Function_C(PathToFile, B)

Function Function_C(Path as string, curDatClass as object) as list(of object)
  dim retVal as List(Of Object)
  Using MyReader As New TextFieldParser(DatafilePath)
            With MyReader
                .TextFieldType = FieldType.Delimited
                .Delimiters = New String() {vbTab}
                'Loop through all of the fields in the file.
                While Not .EndOfData
                    Dim currentRow As String()
                    currentRow = MyReader.ReadFields
                    curDatClass.Add(currentRow)
                    retVal.Add(curDatClass)
                End While
                Return retVal
            End With
        End Using
  retVal = Nothing
End Function

由于每个类都有自己的Sub Add来向属性传递一个值数组,因此属性数量无关紧要,因此类似于上面的泛型子类应该适用于所有类似的类。

List(of A) = Function_C(PathToFile, A)

上面给出了错误“A是一个classtype,不能在表达式中使用”

我找不到一个vb.net示例,说明如何一般地将类/类型作为参数传递,并将函数作为泛型类/类型返回到强类型列表。

上面的代码(为了简洁起见),希望能让你知道我想做什么。

我的搜索没有任何价值。可能我不知道如何提出这个问题,所以我现在就在这里。

1 个答案:

答案 0 :(得分:2)

这就是界面和泛型的用途。如果两个类具有相同的功能,则可以实现接口。您的函数可以将该接口作为参数。至于返回值,您必须使用通用函数。我建议你更多地考虑这两个概念。

Sub Main()

    Dim objectA As New ClassA
    Dim objectB As New ClassB

    Dim listA As List(Of ClassA) = SomeFunction(Of ClassA)(objectA)
    Dim listB As List(Of ClassB) = SomeFunction(Of ClassB)(objectB)

End Sub

Function SomeFunction(Of T As SomeInterface)(ByVal input As T) As List(Of T)

    Dim returnValue As New List(Of T)

    input.Add()

    returnValue.Add(input)

    Return returnValue
End Function

Interface SomeInterface

    Sub Add()

End Interface

Class ClassA
    Implements SomeInterface

    Public Sub Add() Implements SomeInterface.Add

    End Sub

End Class

Class ClassB
    Implements SomeInterface

    Public Sub Add() Implements SomeInterface.Add

    End Sub

End Class

至于你的代码,我建议你打开Option Strict On。你会看到一些问题。此外,我不认为retVal会有你想要的内容,因为你一直在添加相同的对象。