typeresolution.vb
来自「大名鼎鼎的mono是.NET平台的跨平台(支持linux」· VB 代码 · 共 1,025 行 · 第 1/4 页
VB
1,025 行
Case BuiltInDataTypes.[SByte] Return 9 Case BuiltInDataTypes.Short Return 10 Case BuiltInDataTypes.Single Return 11 Case BuiltInDataTypes.String Return 12 Case BuiltInDataTypes.[UInteger] Return 13 Case BuiltInDataTypes.[ULong] Return 14 Case BuiltInDataTypes.[UShort] Return 15 Case Else Throw New InternalException("") End Select End Function Shared Function KeywordToTypeCode(ByVal Keyword As KS) As TypeCode Select Case Keyword Case KS.Boolean Return TypeCode.Boolean Case KS.Byte Return TypeCode.Byte Case KS.Char Return TypeCode.Char Case KS.Date Return TypeCode.DateTime Case KS.Decimal Return TypeCode.Decimal Case KS.Double Return TypeCode.Double Case KS.Integer Return TypeCode.Int32 Case KS.Long Return TypeCode.Int64 Case KS.Object Return TypeCode.Object Case KS.Single Return TypeCode.Single Case KS.Short Return TypeCode.Int16 Case KS.String Return TypeCode.String Case KS.SByte Return TypeCode.SByte Case KS.UShort Return TypeCode.UInt16 Case KS.UInteger Return TypeCode.UInt32 Case KS.ULong Return TypeCode.UInt64 Case Else Throw New InternalException("") End Select End Function ''' <summary> ''' Returns the type of the specified keyword. Throws an internalexception if the keyword isn't a type. ''' </summary> ''' <param name="Keyword"></param> ''' <returns></returns> ''' <remarks></remarks> ''' Function KeywordToType(ByVal Keyword As KS) As Type Select Case Keyword Case KS.Boolean Return Compiler.TypeCache.System_Boolean Case KS.Byte Return Compiler.TypeCache.System_Byte Case KS.Char Return Compiler.TypeCache.System_Char Case KS.Date Return Compiler.TypeCache.System_DateTime Case KS.Decimal Return Compiler.TypeCache.System_Decimal Case KS.Double Return Compiler.TypeCache.System_Double Case KS.Integer Return Compiler.TypeCache.System_Int32 Case KS.Long Return Compiler.TypeCache.System_Int64 Case KS.Object Return Compiler.TypeCache.System_Object Case KS.Single Return Compiler.TypeCache.System_Single Case KS.Short Return Compiler.TypeCache.System_Int16 Case KS.String Return Compiler.TypeCache.System_String Case KS.[SByte] Return Compiler.TypeCache.System_SByte Case KS.[UShort] Return Compiler.TypeCache.System_UInt16 Case KS.[UInteger] Return Compiler.TypeCache.System_UInt32 Case KS.[ULong] Return Compiler.TypeCache.System_UInt64 Case Else 'Throw New InternalException("Don't know if this can actually happen, though. KS = " & Keyword.ToString) Return Nothing End Select End Function Function TypeToKeyword(ByVal Type As Type) As KS If Helper.CompareType(Type, Compiler.TypeCache.System_Boolean) Then Return KS.Boolean ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_Byte) Then Return KS.Byte ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_Char) Then Return KS.Char ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_DateTime) Then Return KS.Date ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_Decimal) Then Return KS.Decimal ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_Double) Then Return KS.Double ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_Int32) Then Return KS.Integer ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_Int64) Then Return KS.Long ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_Object) Then Return KS.Object ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_Int16) Then Return KS.Short ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_Single) Then Return KS.Single ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_String) Then Return KS.String ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_SByte) Then Return KS.[SByte] ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_UInt16) Then Return KS.[UShort] ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_UInt32) Then Return KS.[UInteger] ElseIf Helper.CompareType(Type, Compiler.TypeCache.System_UInt64) Then Return KS.[ULong] Else Return KS.None End If End Function Function IsImplicitlyConvertible(ByVal Compiler As Compiler, ByVal FromType As TypeDescriptor, ByVal ToType As TypeDescriptor) As Boolean Return IsImplicitlyConvertible(Compiler, FromType.TypeInReflection, ToType.TypeInReflection) End Function Function IsImplicitlyConvertible(ByVal Compiler As Compiler, ByVal FromType As Type, ByVal ToType As Type) As Boolean Dim tpFrom, tpTo As TypeCode If Helper.CompareType(Compiler.TypeCache.Nothing, FromType) Then Return True If FromType.IsByRef Then FromType = FromType.GetElementType If ToType.IsByRef Then ToType = ToType.GetElementType tpFrom = Helper.GetTypeCode(Compiler, FromType) tpTo = Helper.GetTypeCode(Compiler, ToType) If tpTo = TypeCode.Object Then Return Helper.IsAssignable(Compiler, FromType, ToType) ' ToType.IsAssignableFrom(FromType) ElseIf Helper.IsEnum(Compiler, ToType) AndAlso Helper.IsEnum(Compiler, FromType) = False Then Return False ElseIf Helper.IsEnum(Compiler, ToType) AndAlso Helper.IsEnum(Compiler, FromType) Then Return Helper.CompareType(ToType, FromType) Else Dim result As Boolean result = Conversion(tpFrom, tpTo).Conversion = ConversionType.Implicit 'Helper.Assert(result = ToType.IsAssignableFrom(FromType) ) Return result End If End Function Function IsNumericType(ByVal Type As Type) As Boolean For Each t As Type In NumericTypes If Helper.CompareType(t, Type) Then Return True Next End Function Function IsIntegralType(ByVal Type As Type) As Boolean For Each t As Type In IntegralTypes If Helper.CompareType(t, Type) Then Return True Next Return False End Function Function IsIntegralType(ByVal Type As TypeCode) As Boolean For Each t As Type In IntegralTypes If Helper.GetTypeCode(Compiler, t) = Type Then Return True Next Return False End Function Function IsIntegralType(ByVal Type As BuiltInDataTypes) As Boolean Return IsIntegralType(BuiltInTypeToTypeCode(Type)) End Function Function IsSignedIntegralType(ByVal Type As Type) As Boolean Return Helper.CompareType(Type, Compiler.TypeCache.System_SByte) OrElse _ Helper.CompareType(Type, Compiler.TypeCache.System_Int16) OrElse _ Helper.CompareType(Type, Compiler.TypeCache.System_Int32) OrElse _ Helper.CompareType(Type, Compiler.TypeCache.System_Int64) End Function Function IsUnsignedIntegralType(ByVal Type As Type) As Boolean Return Helper.CompareType(Type, Compiler.TypeCache.System_Byte) OrElse _ Helper.CompareType(Type, Compiler.TypeCache.System_UInt16) OrElse _ Helper.CompareType(Type, Compiler.TypeCache.System_UInt32) OrElse _ Helper.CompareType(Type, Compiler.TypeCache.System_UInt64) End Function ''' <summary> ''' If the type is an enum type returns the base (integral type), ''' otherwise returns the same type. ''' </summary> ''' <param name="tp"></param> ''' <returns></returns> ''' <remarks></remarks> Function GetIntegralType(ByVal tp As Type) As Type Helper.Assert(tp IsNot Nothing, "tp Is Nothing") If tp.IsEnum Then Dim field As FieldInfo field = tp.GetField(EnumDeclaration.EnumTypeMemberName) Helper.Assert(field IsNot Nothing, "field '" & EnumDeclaration.EnumTypeMemberName & "' Is Nothing of Type '" & tp.FullName & "'") Return field.FieldType Else Helper.Assert(IsIntegralType(tp)) Return tp End If End Function ''' <summary> ''' Finds the smallest type that can hold both specified types. ''' If tp1 = Integer and tp2 = Long would return Long ''' </summary> ''' <param name="tp1"></param> ''' <param name="tp2"></param> ''' <returns></returns> ''' <remarks></remarks> Function GetSmallestIntegralType(ByVal tp1 As Type, ByVal tp2 As Type) As Type Dim cont1(), cont2() As Type Helper.Assert(tp1 IsNot Nothing, "tp1 Is Nothing") Helper.Assert(tp2 IsNot Nothing, "tp2 Is Nothing") Dim itp1, itp2 As Type itp1 = GetIntegralType(tp1) itp2 = GetIntegralType(tp2) cont1 = valCanBeContainBy(getTypeIndex(CType(TypeToKeyword(itp1), BuiltInDataTypes))) cont2 = valCanBeContainBy(getTypeIndex(CType(TypeToKeyword(itp2), BuiltInDataTypes))) If cont1 Is Nothing Or cont2 Is Nothing Then Return Nothing Dim found As New ArrayList For Each t1 As Type In cont1 For Each t2 As Type In cont2 If Helper.CompareType(t1, t2) Then found.Add(t1) End If Next Next
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?