我正在尝试创建一个通用函数,我的入门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
我的问题是:有没有办法从函数内部引用数组中的各个结构字段?我试图让它变得通用,以便学生可以简单地将他们的数组传递给函数 - 他们的结构可能与我的结构不同,字段名称可能不同。
我怀疑还有其他方法可以解决这种情况,但我试图将其保留为结构的简单单维数组。我认为不可能做我想做的事,但我想知道其他人的想法。
答案 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
运算符,这样可以更好地使用类型推断,并且不会尝试计算未返回的表达式