我有几个类用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示例,说明如何一般地将类/类型作为参数传递,并将函数作为泛型类/类型返回到强类型列表。
上面的代码(为了简洁起见),希望能让你知道我想做什么。
我的搜索没有任何价值。可能我不知道如何提出这个问题,所以我现在就在这里。
答案 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会有你想要的内容,因为你一直在添加相同的对象。