创建使用通用结构的函数?

时间:2009-04-01 15:51:47

标签: vb.net generics

我正在尝试创建一个通用函数,我的入门VB .NET课程中的学生可以使用它来搜索结构的单维数组。

我的结构和数组看起来像这样:

 Private Structure Survey  
    Dim idInteger As Integer
    Dim membersInteger As Integer
    Dim incomeInteger As Integer
    Dim stateString As String
    Dim belowPovertyLevelBoolean As Boolean
End Structure

Private incomeSurvey(199) As Survey

我的通用函数标题如下:

Private Function FindSurveyItem(Of xType As Structure)
 (ByVal surveyIDInInt As Integer, ByVal surveyArrayIn() As xType) As Integer

??????

End Function

我对该函数的调用如下:

 If FindSurveyItem(Of Survey)(CInt(idTextBox.Text), incomeSurvey) <> -1 Then

我的问题是:有没有办法从函数内部引用数组中的各个结构字段?我试图让它变得通用,以便学生可以简单地将他们的数组传递给函数 - 他们的结构可能与我的结构不同,字段名称可能不同。

我怀疑还有其他方法可以解决这种情况,但我试图将其保留为结构的简单单维数组。我认为不可能做我想做的事,但我想知道其他人的想法。

5 个答案:

答案 0 :(得分:2)

  

有没有办法从函数内部引用数组中的各个结构字段?

通用而不是数组,您需要一个集合类型。添加LINQ代码:

Dim  Surveys = From svys In xType  
    Where svys.idInteger = surveyIDInInt
    Select svys

For Each rSurveys In svys
    '''' Your Code
Next

这是粗略的答案填写详细信息(我知道想象没有SQL DB的LINQ !!)

答案 1 :(得分:1)

如果您有genric类型参数T,则只能访问编译时已知存在的T实例的成员。由于每个类型都派生自Object,因此只有Object的成员可用 - ToString(),GetType(),GetHashCode()和Equals()。

如果您想访问其他成员,则必须限制允许的内容。在您的情况下,接口将是最佳选择。有关详细信息,请参阅MSDN

您还可以尝试使用反射或在运行时检查实际类型并执行强制转换。如果您对所获得的类型知之甚少,首先很难做到。后者要求你在编译时知道可能的类型,并且在你的情况下也不行。

另一种方法可能是将委托传递给执行实际比较的搜索方法。

答案 2 :(得分:0)

您正在寻找的是谓词,如果使用,则为net 3.5

dim arr() as structure
Array.Find(arr, function(item)(item.MyMember = MemberToMatch))

早期版本更加精简,see here了解更多信息

关键是,你的函数看起来非常像Array.Find的实现(如果你不想使用提供的函数),学生需要编写自己的谓词函数。

答案 3 :(得分:0)

不,没有。您无法在编译时知道类型,因此您无法访问该类型的成员。您需要从结构更改为必须实现IComparable的类,以便在传入的项目和传入的数组之间使用CompareTo

虽然你在方法中尝试做什么并不完全清楚,所以我猜测方法的名称。

答案 4 :(得分:0)

您可以使用反射来获取这些字段,但在这种情况下,没有多大意义。你怎么知道传递的类型有你正在寻找的字段?该代码还存在其他问题。

相反,要做到这一点,我通常会为这样的东西创建一个具有公共ID属性的接口,并限制我对函数的输入以实现该接口,或者正如其他提到的那样使用clr中的内置功能

但这可能超出了学生的位置。如果您只想要一个泛型函数的示例,我的建议是向他们展示旧的vb imediate if函数的类型安全实现:

Public Function IIf(Of T)(ByVal Expression As Boolean, ByVal TruePart As T, ByVal FalsePart As T) AS T
    If Expression Then Return TruePart Else Return FalsePart
End Function

请注意,这也是过时的,因为在VS2008及更高版本中,您可以使用新的If运算符,这样可以更好地使用类型推断,并且不会尝试计算未返回的表达式