查找给定类型的对象

时间:2013-11-06 09:44:22

标签: .net vb.net

我处境很奇怪。我有很多可以相互派生的类,我将对象存储在各种集合中。

例如:

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”会帮助我,因为我对基类很感兴趣。

有没有人有任何想法?也许是某种疯狂的反思魔法?

由于

3 个答案:

答案 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() = recordTypeGetType()方法(继承自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())

例如,如果您的列表项为AccruedCostRecordrecordTypeCostRecord,则会返回True

答案 2 :(得分:-1)

您可以使用GetType.BaseType查看基本类型是否是您要查找的类。  如果没有,你可以深入了解Gettype.Baseytpe.BaseType。