我处境很奇怪。我有很多可以相互派生的类,我将对象存储在各种集合中。
例如:
Record <-- CostRecord <-- AccruedCostRecord
<-- PrepaidCostRecord
<-- StockRecord
对象存储在List(Of Record)中,我想在特定列表中搜索给定类型的记录。
Private Function findRecord(listToSearch As List(of Record), recordName As String, recordType As Type) As Record
For i As Integer = 0 To listToSearch.Count - 1
If listToSearch(i).name.equals(recordName)
'If record is of type "recordType" then return it
End If
Next
End Function
通常我会使用“TypeOf ... Is”运算符,因为我对基类类型也感兴趣。因此,如果我传入“CostRecord”,我希望能够检索AccruedCostRecord,PrepaidCostRecord或StockRecord。
在这种情况下,我不能使用TypeOf,因为它不接受System.Type作为参数,我想不出另一种告诉它我想要的方式。
我不相信“GetType”会帮助我,因为我对基类很感兴趣。
有没有人有任何想法?也许是某种疯狂的反思魔法?
由于
答案 0 :(得分:1)
我会用LINQ重写它,但作为快速回答你可以这样做:
Private Function findRecord(listToSearch As List(of Record), recordName As String, recordType As Type) As Record
For i As Integer = 0 To listToSearch.Count - 1
If listToSearch(i).name.equals(recordName) And listToSearch(i).GetType() = recordType Then
' ...
End If
Next
End Function
关键点是这种比较:listToSearch(i).GetType() = recordType
,GetType()
方法(继承自Object
)将对象类型返回为Type
(然后与您的参数相比)。通过严格比较,它只匹配给定类型的对象(如果您为PrepaidCostRecord
指定recordType
,它将仅匹配,如果您指定CostRecord
,则它将不匹配任何东西)。
要包含派生类(例如,您可以为参数CostRecord
指定recordType
,它将匹配所有派生类,如PrepaidCostRecord
,但不匹配像{{1}这样的祖先你必须把它改成:
Record
最终代码将是:
recordType.IsAssignableFrom(listToSearch(i).GetType())
现在是时候用LINQ重写它了,例如:
Private Function findRecord(listToSearch As List(of Record), recordName As String, recordType As Type) As Record
For i As Integer = 0 To listToSearch.Count - 1
If listToSearch(i).name.equals(recordName) And recordType.IsAssignableFrom(listToSearch(i).GetType()) Then
' ...
End If
Next
End Function
在您的情况下,您可以将其重写为:
Dim records = From record In listToSearch_
Where record.name.equals(recordName) And recordType.IsAssignableFrom(record.GetType)
答案 1 :(得分:1)
您可以在类型上使用.IsAssignableFrom
方法:
If recordType.IsAssignableFrom(listToSearch(i).GetType())
例如,如果您的列表项为AccruedCostRecord
且recordType
为CostRecord
,则会返回True
。
答案 2 :(得分:-1)
您可以使用GetType.BaseType查看基本类型是否是您要查找的类。 如果没有,你可以深入了解Gettype.Baseytpe.BaseType。