helper.vb

来自「大名鼎鼎的mono是.NET平台的跨平台(支持linux」· VB 代码 · 共 1,554 行 · 第 1/5 页

VB
1,554
字号
    Shared Function GetInstanceConstructors(ByVal type As Type) As Generic.List(Of MemberInfo)        Dim result As New Generic.List(Of MemberInfo)        result.AddRange(type.GetConstructors(BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.DeclaredOnly))        Return result    End Function    ''' <summary>    ''' Removes private members if they are from an external assembly.    ''' </summary>    ''' <param name="Members"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function FilterExternalInaccessible(ByVal Compiler As Compiler, ByVal Members As Generic.List(Of MemberInfo)) As Generic.List(Of MemberInfo)        Dim result As New Generic.List(Of MemberInfo)        For i As Integer = 0 To Members.Count - 1            Dim member As MemberInfo = Members(i)            If (IsPrivate(member) OrElse IsFriend(member)) AndAlso Compiler.Assembly.IsDefinedHere(member.DeclaringType) = False Then                Continue For            End If            result.Add(member)        Next        Return result    End Function    Shared Function IsProtectedOrAssem(ByVal Member As MemberInfo) As Boolean        Helper.Assert(Member IsNot Nothing)        Select Case Member.MemberType            Case MemberTypes.Constructor                Dim ctor As ConstructorInfo = DirectCast(Member, ConstructorInfo)                Return ctor.IsFamilyOrAssembly            Case MemberTypes.Event                Dim eventM As EventInfo = DirectCast(Member, EventInfo)                Return CBool(Helper.GetEventAccess(eventM) = MethodAttributes.FamORAssem)            Case MemberTypes.Field                Dim field As FieldInfo = DirectCast(Member, FieldInfo)                Return field.IsFamilyOrAssembly            Case MemberTypes.NestedType                Dim tp As Type = DirectCast(Member, Type)                Return tp.IsNestedFamORAssem            Case MemberTypes.Method                Dim method As MethodInfo = DirectCast(Member, MethodInfo)                Return method.IsFamilyOrAssembly OrElse method.IsFamily            Case MemberTypes.Property                Dim propM As PropertyInfo = DirectCast(Member, PropertyInfo)                Return Helper.GetPropertyAccess(propM) = MethodAttributes.FamORAssem            Case MemberTypes.TypeInfo                Dim tp As Type = DirectCast(Member, Type)                Return tp.IsNotPublic OrElse tp.IsNested AndAlso tp.IsNestedFamORAssem            Case Else                Throw New InternalException("")        End Select    End Function    Shared Function IsFriend(ByVal Member As MemberInfo) As Boolean        Helper.Assert(Member IsNot Nothing)        Select Case Member.MemberType            Case MemberTypes.Constructor                Return DirectCast(Member, ConstructorInfo).IsAssembly            Case MemberTypes.Event                Dim eventM As EventInfo = DirectCast(Member, EventInfo)                Return CBool(Helper.GetEventAccess(eventM) = MethodAttributes.Assembly)            Case MemberTypes.Field                Return DirectCast(Member, FieldInfo).IsAssembly            Case MemberTypes.NestedType                Return DirectCast(Member, Type).IsNestedAssembly            Case MemberTypes.Method                Return DirectCast(Member, MethodInfo).IsAssembly            Case MemberTypes.Property                Dim propM As PropertyInfo = DirectCast(Member, PropertyInfo)                Return Helper.GetPropertyAccess(propM) = MethodAttributes.Assembly            Case MemberTypes.TypeInfo                Dim tp As Type = DirectCast(Member, Type)                Return tp.IsNotPublic OrElse tp.IsNested AndAlso tp.IsNestedAssembly            Case Else                Throw New InternalException("")        End Select    End Function    Shared Function IsPrivate(ByVal Member As MemberInfo) As Boolean        Select Case Member.MemberType            Case MemberTypes.Constructor                Return DirectCast(Member, ConstructorInfo).IsPrivate            Case MemberTypes.Event                Dim eventM As EventInfo = DirectCast(Member, EventInfo)                Return CBool(Helper.GetEventAccess(eventM) = MethodAttributes.Private)            Case MemberTypes.Field                Return DirectCast(Member, FieldInfo).IsPrivate            Case MemberTypes.NestedType                Return DirectCast(Member, Type).IsNestedPrivate            Case MemberTypes.Method                Return DirectCast(Member, MethodInfo).IsPrivate            Case MemberTypes.Property                Dim pInfo As PropertyInfo = DirectCast(Member, PropertyInfo)                Return Helper.GetPropertyAccess(pInfo) = MethodAttributes.Private            Case MemberTypes.TypeInfo                Dim tp As Type = DirectCast(Member, Type)                Return tp.IsNested AndAlso tp.IsNestedPrivate            Case Else                Throw New InternalException("")        End Select    End Function    Shared Function IsPublic(ByVal Member As MemberInfo) As Boolean        Select Case Member.MemberType            Case MemberTypes.Constructor                Return DirectCast(Member, ConstructorInfo).IsPublic            Case MemberTypes.Event                Dim eventM As EventInfo = DirectCast(Member, EventInfo)                Return CBool(Helper.GetEventAccess(eventM) = MethodAttributes.Public)            Case MemberTypes.Field                Return DirectCast(Member, FieldInfo).IsPublic            Case MemberTypes.Method                Return DirectCast(Member, MethodInfo).IsPublic            Case MemberTypes.Property                Dim pInfo As PropertyInfo = DirectCast(Member, PropertyInfo)                Return Helper.GetPropertyAccess(pInfo) = MethodAttributes.Public            Case MemberTypes.TypeInfo, MemberTypes.NestedType                Dim tp As Type = DirectCast(Member, Type)                Return tp.IsPublic OrElse (tp.IsNested AndAlso tp.IsNestedPublic)            Case Else                Throw New InternalException("")        End Select    End Function    Shared Function FilterByTypeArguments(ByVal Members As Generic.List(Of MemberInfo), ByVal TypeArguments As TypeArgumentList) As Generic.List(Of MemberInfo)        Dim result As New Generic.List(Of MemberInfo)        Dim argCount As Integer        If TypeArguments IsNot Nothing Then argCount = TypeArguments.Count        For i As Integer = 0 To Members.Count - 1            Dim member As MemberInfo = Members(i)            Dim minfo As MethodInfo = TryCast(member, MethodInfo)            If minfo IsNot Nothing Then                If minfo.GetGenericArguments.Length = argCount Then                    If argCount > 0 Then                        member = TypeArguments.Parent.Compiler.TypeManager.MakeGenericMethod(TypeArguments.Parent, minfo, minfo.GetGenericArguments, TypeArguments.AsTypeArray)                        result.Add(member)                    Else                        result.Add(member)                    End If                Else                    'Helper.StopIfDebugging()                End If            Else                result.Add(member)            End If        Next        Return result    End Function    <Obsolete()> Shared Function FilterByName(ByVal members() As MemberInfo, ByVal Name As String) As Generic.List(Of MemberInfo)        Dim result As New Generic.List(Of MemberInfo)        Helper.AssertNotNothing(members)        For Each member As MemberInfo In members            If NameResolution.CompareName(member.Name, Name) Then result.Add(member)        Next        Return result    End Function    Shared Function FilterByName(ByVal members() As PropertyInfo, ByVal Name As String) As Generic.List(Of PropertyInfo)        Dim result As New Generic.List(Of PropertyInfo)        Helper.AssertNotNothing(members)        For Each member As PropertyInfo In members            If NameResolution.CompareName(member.Name, Name) Then result.Add(member)        Next        Return result    End Function    Shared Function FilterByName2(ByVal Members As Generic.List(Of MemberInfo), ByVal Name As String) As Generic.List(Of MemberInfo)        Dim result As New Generic.List(Of MemberInfo)        For Each member As MemberInfo In Members            If NameResolution.CompareName(member.Name, Name) Then result.Add(member)        Next        Return result    End Function    Shared Function FilterByName(ByVal collection As ICollection, ByVal Name As String) As ArrayList        Dim result As New ArrayList        Dim tmpname As String = ""        For Each obj As Object In collection            If TypeOf obj Is INameable Then                tmpname = DirectCast(obj, INameable).Name            ElseIf TypeOf obj Is MemberInfo Then                tmpname = DirectCast(obj, MemberInfo).Name            Else                Helper.NotImplemented()            End If            If NameResolution.CompareName(Name, tmpname) Then result.Add(obj)        Next        Return result    End Function    Shared Function FilterByName(ByVal collection As Generic.List(Of Type), ByVal Name As String) As Generic.List(Of Type)        Dim result As New Generic.List(Of Type)        Dim tmpname As String = ""        For Each obj As Type In collection            If NameResolution.CompareName(Name, obj.Name) Then result.Add(obj)        Next        Return result    End Function    Shared Sub FilterByName(ByVal collection As Generic.List(Of Type), ByVal Name As String, ByVal result As Generic.List(Of MemberInfo))        For Each obj As Type In collection            If NameResolution.NameCompare(Name, obj.Name) Then result.Add(obj)        Next    End Sub    Shared Sub FilterByName(ByVal collection As TypeDictionary, ByVal Name As String, ByVal result As Generic.List(Of MemberInfo))        For Each obj As Type In collection.Values            If NameResolution.NameCompare(Name, obj.Name) Then result.Add(obj)        Next    End Sub    Shared Function FilterByName(ByVal Types As TypeList, ByVal Name As String) As TypeList        Dim result As New TypeList        For Each obj As Type In Types            If NameResolution.CompareName(Name, obj.Name) Then result.Add(obj)        Next        Return result    End Function    Shared Function FilterByName(ByVal Types As TypeDictionary, ByVal Name As String) As Type        If Types.ContainsKey(Name) Then            Return Types(Name)        Else            Return Nothing        End If    End Function    '''' <summary>    '''' Returns a list of type descriptors that only are modules.    '''' </summary>    '''' <param name="Types"></param>    '''' <returns></returns>    '''' <remarks></remarks>    '<Obsolete()> Shared Function FilterToModules(ByVal Compiler As Compiler, ByVal Types As Generic.List(Of Type)) As Generic.List(Of Type)    '    Dim result As New Generic.List(Of Type)    '    For Each t As Type In Types    '        If IsModule(Compiler, t) Then result.Add(t)    '    Next    '    Return result    'End Function    ''' <summary>    ''' Returns a list of type descriptors that only are modules.    ''' </summary>    ''' <param name="Types"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function FilterToModules(ByVal Compiler As Compiler, ByVal Types As TypeDictionary) As Generic.List(Of Type)        Dim result As New Generic.List(Of Type)        For Each t As Type In Types.Values            If IsModule(Compiler, t) Then result.Add(t)        Next        Return result    End Function    ''' <summary>    ''' Finds a non-private, non-shared constructor with no parameters in the array.    ''' If nothing found, returns nothing.    ''' </summary>    ''' <param name="Constructors"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Function GetDefaultConstructor(ByVal Constructors() As ConstructorInfo) As ConstructorInfo        For i As Integer = 0 To Constructors.GetUpperBound(0)            If HasParameters(Constructors(i)) = False OrElse HasOnlyOptionalParameters(Constructors(i)) Then                If Constructors(i).IsStatic = False AndAlso Constructors(i).IsPrivate = False Then                    Return Constructors(i)                End If            End If        Next        Return Nothing    End Function    Function HasOnlyOptionalParameters(ByVal Constructor As ConstructorInfo) As Boolean        Helper.Assert(HasParameters(Constructor))        Return Constructor.GetParameters(0).IsOptional    End Function    ''' <summary>    ''' Returns true if this constructor has any parameter, default or normal parameter.    ''' </summary>    ''' <param name="Constructor"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function HasParameters(ByVal Constructor As ConstructorInfo) As Boolean        Return Constructor.GetParameters().Length > 0    End Function    ''' <summary>    ''' Finds a public, non-shared constructor with no parameters of the type.    ''' If nothing found, returns nothing.    ''' </summary>    ''' <param name="tp"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Function GetDefaultConstructor(ByVal tp As Type) As ConstructorInfo        Return GetDefaultConstructor(GetConstructors(tp))    End Function

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?