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 + -
显示快捷键?