简体   繁体   中英

VB.Net Check to see if Type is an IEnumerable

I have System.Type object (retType). I get this with Reflection from my policy object that I pass in . How can I test to see if its enumerable? Any help would be most appreciated code is below.

 Public Shared Function SerializeChanges(p As Model.Policy_2.Policy) As XmlDocument

    Dim polProps As PropertyInfo() = p.GetType().GetProperties()
        For Each pi As PropertyInfo In polProps
        Dim retType As Type = pi.PropertyType
       ' This line belowthrows an error that IEnumerable is an Interface and cannot be used as an expression
        If retType Is IEnumerable Then
           'Do Stuff

        End If
End Function

The following method is a generic method to check whether a given type inherits or implements another type:

Function InheritsOrImplements(child As Type, parent As Type) As Boolean
    If child Is Nothing OrElse parent Is Nothing Then
        Return False
    End If

    parent = resolveGenericTypeDefinition(parent)

    If parent.IsAssignableFrom(child) Then
        Return True
    End If

    Dim currentChild = If(child.IsGenericType, child.GetGenericTypeDefinition(), child)

    While currentChild <> GetType(Object)
        If parent = currentChild OrElse hasAnyInterfaces(parent, currentChild) Then
            Return True
        End If

        currentChild = If(currentChild.BaseType IsNot Nothing AndAlso currentChild.BaseType.IsGenericType, currentChild.BaseType.GetGenericTypeDefinition(), currentChild.BaseType)

        If currentChild Is Nothing Then
            Return False
        End If
    End While

    Return False
End Function

Function hasAnyInterfaces(parent As Type, child As Type) As Boolean
    Return child.GetInterfaces().Any(Function(childInterface) 
        Dim currentInterface = If(childInterface.IsGenericType, childInterface.GetGenericTypeDefinition(), childInterface)

        Return currentInterface = parent

    End Function)
End Function

Function resolveGenericTypeDefinition(type As Type) As Type
    Dim shouldUseGenericType = Not (type.IsGenericType AndAlso type.GetGenericTypeDefinition() <> type)
    If type.IsGenericType AndAlso shouldUseGenericType Then
        type = type.GetGenericTypeDefinition()
    End If
    Return type
End Function

Taken from https://github.com/shaynevanasperen/Quarks/blob/master/Quarks/TypeExtensions/InheritsOrImplements.cs

Usage:

InheritsOrImplements(retType, GetType(IEnumerable))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM