helper.vb

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

VB
1,554
字号
    Shared Function GetBaseMembers(ByVal Compiler As Compiler, ByVal Type As Type) As MemberInfo() ' Generic.List(Of MemberInfo)        Dim result As New Generic.List(Of MemberInfo)#If EXTENDEDDEBUG Then        Compiler.Report.WriteLine("Getting base members for type " & Type.FullName)#End If        If Type.IsInterface Then            Dim ifaces() As Type            ifaces = Type.GetInterfaces()            For Each iface As Type In ifaces                result.AddRange(iface.GetMembers(Helper.ALLMEMBERS))            Next            'Remove duplicates (might happen since interfaces can have multiple bases)            Dim tmp As New Generic.List(Of MemberInfo)            For Each item As MemberInfo In result                If tmp.Contains(item) = False Then tmp.Add(item)            Next            result = tmp        ElseIf Type.BaseType IsNot Nothing Then            result.AddRange(Type.BaseType.GetMembers(Helper.ALLMEMBERS))        End If        Return result.ToArray    End Function    ''' <summary>    ''' Returns an array of the types of the method info. DEBUG METHOD!!    ''' </summary>    ''' <param name="method"></param>    ''' <returns></returns>    ''' <remarks></remarks>    <Diagnostics.Conditional("DEBUG")> Shared Function GetParameterTypes(ByVal Compiler As Compiler, ByVal method As MethodInfo) As Type()        Dim result As Type()        Dim builder As MethodBuilder = TryCast(method, MethodBuilder)        If builder IsNot Nothing Then            Dim reflectableInfo As MethodInfo = TryCast(Compiler.TypeManager.GetRegisteredMember(builder), MethodInfo)            If reflectableInfo IsNot Nothing Then                result = GetParameterTypes(reflectableInfo.GetParameters)            Else                Helper.Assert(False)                result = CType(GetType(MethodBuilder).GetField("m_parameterTypes", BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public).GetValue(builder), Type())            End If        Else            result = GetParameterTypes(method.GetParameters())        End If        Return result    End Function    ''' <summary>    ''' Returns an array of the types of the method info. DEBUG METHOD!!    ''' </summary>    ''' <returns></returns>    ''' <remarks></remarks>    <Diagnostics.Conditional("DEBUG")> Shared Function GetParameterTypes(ByVal Compiler As Compiler, ByVal ctor As ConstructorInfo) As Type()        Dim result As Type()        Dim builder As ConstructorBuilder = TryCast(ctor, ConstructorBuilder)        If builder IsNot Nothing Then            Dim tmp As ConstructorInfo = TryCast(Compiler.TypeManager.GetRegisteredMember(builder), ConstructorInfo)            Dim method As MethodBuilder            If tmp IsNot Nothing Then                result = GetParameterTypes(tmp.GetParameters)            Else                Helper.Assert(False)                method = CType(GetType(ConstructorBuilder).GetField("m_methodBuilder", BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public).GetValue(builder), MethodBuilder)                result = GetParameterTypes(Compiler, method)            End If        Else            result = GetParameterTypes(ctor.GetParameters())        End If        Return result    End Function    Shared Function GetGenericParameterConstraints(ByVal Type As Type) As Type()        If Type.IsGenericParameter = False Then Throw New InternalException("")        If TypeOf Type Is GenericTypeParameterBuilder Then            Helper.NotImplemented() : Throw New InternalException("")        Else            Return Type.GetGenericParameterConstraints        End If    End Function    Shared Function IsAssembly(ByVal member As MemberInfo) As Boolean        Dim mi As MethodInfo = TryCast(member, MethodInfo)        If mi IsNot Nothing Then            Return mi.IsAssembly        Else            Dim ci As ConstructorInfo = TryCast(member, ConstructorInfo)            If ci IsNot Nothing Then                Return ci.IsAssembly            Else                Dim fi As FieldInfo = TryCast(member, FieldInfo)                If fi IsNot Nothing Then                    Return fi.IsAssembly                Else                    Helper.NotImplemented()                End If            End If        End If    End Function    Shared Function GetNames(ByVal List As IEnumerable) As String()        Dim result As New Generic.List(Of String)        For Each item As INameable In List            result.Add(item.Name)        Next        Return result.ToArray    End Function    Shared Function GetTypeCode(ByVal Compiler As Compiler, ByVal Type As TypeDescriptor) As TypeCode        If Helper.IsEnum(Compiler, Type) Then            Return GetTypeCode(Compiler, Type.GetElementType)        Else            Return TypeCode.Object        End If    End Function    ''' <summary>    ''' Compares two vb-names (case-insensitive)    ''' </summary>    ''' <param name="Value1"></param>    ''' <param name="Value2"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function NameCompare(ByVal Value1 As String, ByVal Value2 As String) As Boolean        Helper.Assert(Value1 IsNot Nothing)        Helper.Assert(Value2 IsNot Nothing)        Return String.Compare(Value1, Value2, StringComparison.OrdinalIgnoreCase) = 0    End Function    ''' <summary>    ''' Compares two names.    ''' </summary>    ''' <param name="Value1"></param>    ''' <param name="Value2"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function NameCompare(ByVal Value1 As String, ByVal Value2 As String, ByVal Ordinal As Boolean) As Boolean        If Ordinal Then            Return NameCompareOrdinal(Value1, Value2)        Else            Return NameCompare(Value1, Value2)        End If    End Function    ''' <summary>    ''' Compares two names.    ''' </summary>    ''' <param name="Value1"></param>    ''' <param name="Value2"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function NameCompareOrdinal(ByVal Value1 As String, ByVal Value2 As String) As Boolean        Helper.Assert(Value1 IsNot Nothing)        Helper.Assert(Value2 IsNot Nothing)        Return String.CompareOrdinal(Value1, Value2) = 0    End Function    ''' <summary>    ''' Compares two vb-names (case-insensitive)    ''' </summary>    ''' <param name="Value1"></param>    ''' <param name="Value2"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function CompareName(ByVal Value1 As String, ByVal Value2 As String) As Boolean        Return NameCompare(Value1, Value2)    End Function    Shared Function CompareNameStart(ByVal Whole As String, ByVal Start As String) As Boolean        Return String.Compare(Whole, 0, Start, 0, Start.Length, StringComparison.OrdinalIgnoreCase) = 0    End Function    ''' <summary>    ''' Compares two strings.    ''' </summary>    ''' <param name="Value1"></param>    ''' <param name="Value2"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function CompareName(ByVal Value1 As String, ByVal Value2 As String, ByVal Ordinal As Boolean) As Boolean        Return NameCompare(Value1, Value2, Ordinal)    End Function    ''' <summary>    ''' Compares two strings.    ''' </summary>    ''' <param name="Value1"></param>    ''' <param name="Value2"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function CompareNameOrdinal(ByVal Value1 As String, ByVal Value2 As String) As Boolean        Return NameCompare(Value1, Value2)    End Function    Shared Function GetTypeCode(ByVal Compiler As Compiler, ByVal Type As Type) As TypeCode        Dim tD As TypeDescriptor = TryCast(Type, TypeDescriptor)        If tD Is Nothing Then            Return System.Type.GetTypeCode(Type)        Else            Return GetTypeCode(Compiler, tD)        End If    End Function    Shared Function IsTypeDeclaration(ByVal first As Object) As Boolean        Return TypeOf first Is TypeDescriptor OrElse TypeOf first Is IType OrElse TypeOf first Is Type    End Function    Shared Function IsFieldDeclaration(ByVal first As Object) As Boolean        Return TypeOf first Is VariableDeclaration OrElse TypeOf first Is FieldInfo    End Function    Shared Function IsInterface(ByVal Compiler As Compiler, ByVal Type As Type) As Boolean        Dim tmpTP As Type        If Type.GetType.Name = "SymbolType" Then Return Type.IsInterface        tmpTP = Compiler.TypeManager.GetRegisteredType(Type)        If TypeOf Type Is GenericTypeParameterBuilder Then            Return False        ElseIf TypeOf tmpTP Is TypeParameterDescriptor Then            Return False        ElseIf tmpTP.IsByRef Then            Return False        ElseIf TypeOf Type Is Type Then            Return Compiler.TypeManager.GetRegisteredType(Type).IsInterface        Else            Helper.NotImplemented()        End If    End Function    Shared Function IsEnum(ByVal Compiler As Compiler, ByVal Type As Type) As Boolean        If TypeOf Type Is TypeBuilder Then            Return Type.IsEnum        ElseIf TypeOf Type Is TypeParameterDescriptor Then            Return False        ElseIf TypeOf Type Is TypeDescriptor Then            Return Type.IsEnum        End If        'Dim FullName As String = Type.GetType.FullName        'If FullName = "System.Type" Then        'Return Type.IsEnum        'Else        If Type.GetType Is Compiler.TypeCache.System_Reflection_Emit_TypeBuilderInstantiation Then            'ElseIf FullName.Contains("TypeBuilderInstantiation") Then            Return False        ElseIf Type.GetType Is Compiler.TypeCache.System_RuntimeType Then            'ElseIf FullName.Contains("RuntimeType") Then            Return Type.IsEnum        ElseIf Type.GetType Is Compiler.TypeCache.System_Reflection_Emit_SymbolType Then            'ElseIf FullName.Contains("SymbolType") Then            Return False        ElseIf Type.GetType.Namespace = "System.Reflection.Emit" Then            Return False        ElseIf TypeOf Type Is TypeParameterDescriptor Then            Return False        Else            Return Type.IsEnum            'Helper.NotImplementedYet("IsEnum of type '" & Type.GetType.FullName & "'")        End If    End Function    Shared Function IsEnumFieldDeclaration(ByVal first As Object) As Boolean        If TypeOf first Is EnumMemberDeclaration Then Return True        Dim fld As FieldInfo = TryCast(first, FieldInfo)        Return fld IsNot Nothing AndAlso fld.DeclaringType.IsEnum    End Function    Shared Function IsEventDeclaration(ByVal first As Object) As Boolean        Return TypeOf first Is EventInfo    End Function    Shared Function IsPropertyDeclaration(ByVal first As Object) As Boolean        Return TypeOf first Is RegularPropertyDeclaration OrElse TypeOf first Is PropertyInfo OrElse TypeOf first Is PropertyDeclaration    End Function    Shared Function IsMethodDeclaration(ByVal first As Object) As Boolean        Return TypeOf first Is SubDeclaration OrElse TypeOf first Is FunctionDeclaration OrElse TypeOf first Is IMethod OrElse TypeOf first Is MethodInfo    End Function    ''' <summary>    ''' Returns all the members in the types with the specified name.    ''' </summary>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function GetMembersOfTypes(ByVal Compiler As Compiler, ByVal Types As TypeDictionary, ByVal Name As String) As Generic.List(Of MemberInfo)        Dim result As New Generic.List(Of MemberInfo)        For Each type As Type In Types.Values            Dim members As Generic.List(Of MemberInfo)            members = Compiler.TypeManager.GetCache(type).LookupFlattenedMembers(Name)            If members IsNot Nothing Then result.AddRange(members)        Next        Return result    End Function    ''' <summary>    ''' Returns all the members in the types with the specified name.    ''' </summary>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function GetMembersOfTypes(ByVal Compiler As Compiler, ByVal Types As TypeList, ByVal Name As String) As Generic.List(Of MemberInfo)        Dim result As New Generic.List(Of MemberInfo)        For Each type As Type In Types            Dim members As Generic.List(Of MemberInfo)            members = Compiler.TypeManager.GetCache(type).LookupFlattenedMembers(Name)            If members IsNot Nothing Then result.AddRange(members)        Next        Return result    End Function

⌨️ 快捷键说明

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