📄 objecttype.vb
字号:
'' ObjectType.vb'' Author:' Mizrahi Rafael (rafim@mainsoft.com)' Guy Cohen (guyc@mainsoft.com)'' Copyright (C) 2002-2006 Mainsoft Corporation.' Copyright (C) 2004-2006 Novell, Inc (http://www.novell.com)'' Permission is hereby granted, free of charge, to any person obtaining' a copy of this software and associated documentation files (the' "Software"), to deal in the Software without restriction, including' without limitation the rights to use, copy, modify, merge, publish,' distribute, sublicense, and/or sell copies of the Software, and to' permit persons to whom the Software is furnished to do so, subject to' the following conditions:' ' The above copyright notice and this permission notice shall be' included in all copies or substantial portions of the Software.' ' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,' EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF' MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND' NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE' LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION' OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION' WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.Imports SystemNamespace Microsoft.VisualBasic.CompilerServices <System.ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)> _ Public NotInheritable Class ObjectType Public Sub New() End Sub Private Shared Function BiggestTypeCode(ByVal obj1 As System.Object, ByVal obj2 As System.Object) As System.TypeCode Dim type1 As Type = obj1.GetType() Dim type2 As Type = obj2.GetType() Dim LTypeFound As TypeCode Dim TC1 As TypeCode = Type.GetTypeCode(type1) Dim TC2 As TypeCode = Type.GetTypeCode(type2) Select Case TC1 Case TypeCode.Boolean If (TC2 = TypeCode.Byte) Then LTypeFound = TC1 ElseIf (TC2 = TypeCode.String) Then LTypeFound = TypeCode.Double Else LTypeFound = TC2 End If Case TypeCode.Byte If (TC2 = TypeCode.String) Then LTypeFound = TypeCode.Double Else LTypeFound = TC2 End If Case TypeCode.Int16 If (TC2 = TypeCode.Boolean) Or (TC2 = TypeCode.Byte) Then LTypeFound = TC1 ElseIf (TC2 = TypeCode.String) Then LTypeFound = TypeCode.Double Else LTypeFound = TC2 End If Case TypeCode.Int32 If (TC2 = TypeCode.Boolean) Or (TC2 = TypeCode.Byte) Or (TC2 = TypeCode.Int16) Then LTypeFound = TC1 ElseIf (TC2 = TypeCode.String) Then LTypeFound = TypeCode.Double Else LTypeFound = TC2 End If Case TypeCode.Int64 If (TC2 = TypeCode.Single) Or (TC2 = TypeCode.Double) Or (TC2 = TypeCode.Decimal) Then LTypeFound = TC1 ElseIf (TC2 = TypeCode.String) Then LTypeFound = TypeCode.Double Else LTypeFound = TC2 End If Case TypeCode.Decimal If (TC2 = TypeCode.Single) Or (TC2 = TypeCode.Double) Then LTypeFound = TC2 ElseIf (TC2 = TypeCode.String) Then LTypeFound = TypeCode.Double Else LTypeFound = TC1 End If Case TypeCode.Single If (TC2 = TypeCode.Single) Or (TC2 = TypeCode.Double) Then LTypeFound = TC2 ElseIf (TC2 = TypeCode.String) Then LTypeFound = TypeCode.Double Else LTypeFound = TC1 End If Case TypeCode.Double If (TC2 = TypeCode.String) Then LTypeFound = TypeCode.Double Else LTypeFound = TC1 End If Case TypeCode.String LTypeFound = TypeCode.Double End Select Return LTypeFound End Function Public Shared Function ObjTst(ByVal o1 As System.Object, ByVal o2 As System.Object, ByVal TextCompare As System.Boolean) As System.Int32 Dim b1 As Byte Dim b2 As Byte Dim bool1 As Boolean Dim bool2 As Boolean Dim dbl1 As Double Dim dbl2 As Double Dim f1 As Single Dim f2 As Single Dim dec1 As Decimal Dim dec2 As Decimal Dim l1 As Long Dim l2 As Long Dim i1 As Integer Dim i2 As Integer Dim short1 As Short Dim short2 As Short Dim dt1 As Date Dim dt2 As Date Dim s1 As String Dim s2 As String Dim c1 As Char Dim c2 As Char ' comparing null objects ' if both are null, return 0 ' if one is a type, convert the other to its 'null value' If (o1 Is Nothing) And (o2 Is Nothing) Then Return 0 End If If (o1 Is Nothing) Then o1 = CreateNullObjectType(o2) End If If (o2 Is Nothing) Then o2 = CreateNullObjectType(o1) End If 'FIXME: Add ElseIf implementation for all types If (TypeOf o1 Is Double) Or (TypeOf o2 Is Double) Then dbl1 = Convert.ToDouble(o1) dbl2 = Convert.ToDouble(o2) If dbl1 < dbl2 Then Return -1 End If If dbl1 > dbl2 Then Return 1 End If 'If dbl1 = dbl2 Return 0 ElseIf (TypeOf o1 Is Single) Or (TypeOf o2 Is Single) Then f1 = Convert.ToSingle(o1) f2 = Convert.ToSingle(o2) If f1 < f2 Then Return -1 End If If f1 > f2 Then Return 1 End If 'If f1 = f2 Return 0 ElseIf (TypeOf o1 Is Decimal) Or (TypeOf o2 Is Decimal) Then dec1 = Convert.ToDecimal(o1) dec2 = Convert.ToDecimal(o2) If dec1 < dec2 Then Return -1 End If If dec1 > dec2 Then Return 1 End If 'If dec1 = dec2 Return 0 ElseIf (TypeOf o1 Is Long) Or (TypeOf o2 Is Long) Then l1 = Convert.ToInt64(o1) l2 = Convert.ToInt64(o2) If l1 < l2 Then Return -1 End If If l1 > l2 Then Return 1 End If 'If l1 = l2 Return 0 ElseIf (TypeOf o1 Is Integer) Or (TypeOf o2 Is Integer) Then i1 = Convert.ToInt32(o1) i2 = Convert.ToInt32(o2) If i1 < i2 Then Return -1 End If If i1 > i2 Then Return 1 End If 'If i1 = i2 Return 0 ElseIf (TypeOf o1 Is Short) Or (TypeOf o2 Is Short) Then short1 = Convert.ToInt16(o1) short2 = Convert.ToInt16(o2) If short1 < short2 Then Return -1 End If If short1 > short2 Then Return 1 End If 'If short1 = short2 Return 0 ElseIf (TypeOf o1 Is Date) Or (TypeOf o2 Is Date) Then dt1 = DateType.FromObject(o1) dt2 = DateType.FromObject(o2) Return dt1.CompareTo(dt2) ElseIf (TypeOf o1 Is String) Or (TypeOf o2 Is String) Then s1 = Convert.ToString(o1) s2 = Convert.ToString(o2) Return s1.CompareTo(s2) ElseIf (TypeOf o1 Is Char) Or (TypeOf o2 Is Char) Then c1 = Convert.ToChar(o1) c2 = Convert.ToChar(o2) Return c1.CompareTo(c2) ElseIf (TypeOf o1 Is Byte) Or (TypeOf o2 Is Byte) Then b1 = Convert.ToByte(o1) b2 = Convert.ToByte(o2) Return b1.CompareTo(b2) ElseIf (TypeOf o1 Is Boolean) Or (TypeOf o2 Is Boolean) Then bool1 = Convert.ToBoolean(o1) bool2 = Convert.ToBoolean(o2) Return bool1.CompareTo(bool2) Else ' Not implemented case Throw GetCaseNotImplemented() End If End Function Friend Shared Function GetCaseNotImplemented() As System.Exception Return New NotImplementedException("This case is not handled") End Function Friend Shared Function GetCaseNotImplemented(ByVal msg As System.String) As System.Exception Return New NotImplementedException(msg) End Function Public Shared Function PlusObj(ByVal obj As System.Object) As System.Object Throw New NotImplementedException End Function Public Shared Function NegObj(ByVal obj As System.Object) As System.Object Dim TC1 As TypeCode = Type.GetTypeCode(obj.GetType()) Select Case (TC1) Case TypeCode.Boolean '' VB True is anyway -1 Return ((ShortType.FromObject(obj))) Case TypeCode.Byte Return (-1 * (ByteType.FromObject(obj))) Case TypeCode.Double Return (-1 * (DoubleType.FromObject(obj))) Case TypeCode.Decimal Return (-1 * (DecimalType.FromObject(obj))) Case TypeCode.Int32 Return (-1 * (IntegerType.FromObject(obj))) Case TypeCode.Int16 Return (-1S * (ShortType.FromObject(obj))) Case TypeCode.Int64 Return (-1 * (LongType.FromObject(obj))) Case TypeCode.Single Return (-1 * (SingleType.FromObject(obj))) Case TypeCode.String Dim dbl1 As Double = Convert.ToDouble(obj) Return (Convert.ToString(-1 * DoubleType.FromObject(obj))) Case Else Throw GetCaseNotImplemented() End Select End Function Public Shared Function NotObj(ByVal obj As System.Object) As System.Object If obj Is Nothing Then Return Nothing End If 'Dim type1 As Type = obj.GetType() ' Type.GetTypeCode(type1) Return Not BooleanType.FromObject(obj) Throw New InvalidCastException End Function Public Shared Function BitAndObj(ByVal obj1 As System.Object, ByVal obj2 As System.Object) As System.Object Dim dbl1 As Double Dim dbl2 As Double Dim sn1 As Single Dim sn2 As Single Dim dec1 As Decimal Dim dec2 As Decimal Dim l1 As Long Dim l2 As Long Dim i1 As Integer Dim i2 As Integer Dim short1 As Short Dim short2 As Short '' FIXME: return typecode should be the second obj's typecode '' and not int32 all the time If (obj1 Is Nothing) Then Return 0 End If If (obj2 Is Nothing) Then Return 0 End If Dim TC1 As TypeCode = Type.GetTypeCode(obj1.GetType()) Dim TC2 As TypeCode = Type.GetTypeCode(obj2.GetType()) '' select the TypeCode to return Dim LTypeFound As TypeCode = BiggestTypeCode(obj1, obj2) Select Case (LTypeFound) Case TypeCode.Boolean Return ((BooleanType.FromObject(obj1)) And (Convert.ToBoolean(obj2))) Case TypeCode.Byte Return ((ByteType.FromObject(obj1)) And (Convert.ToByte(obj2))) Case TypeCode.Double If TC1 = TypeCode.Boolean Then dbl1 = -1 * Convert.ToDouble(obj1) Else dbl1 = Convert.ToDouble(obj1) End If If TC2 = TypeCode.Boolean Then dbl2 = -1 * Convert.ToDouble(obj2) Else dbl2 = Convert.ToDouble(obj2) End If Return (Convert.ToInt64(dbl1) And Convert.ToInt64(dbl2)) Case TypeCode.Decimal If TC1 = TypeCode.Boolean Then dec1 = -1 * Convert.ToDecimal(obj1) Else dec1 = Convert.ToDecimal(obj1) End If If TC2 = TypeCode.Boolean Then dec2 = -1 * Convert.ToDecimal(obj2) Else dec2 = Convert.ToDecimal(obj2) End If Return (Convert.ToInt64(dec1) And Convert.ToInt64(dec2)) Case TypeCode.Int32 If TC1 = TypeCode.Boolean Then i1 = -1 * Convert.ToInt32(obj1) Else i1 = Convert.ToInt32(obj1) End If If TC2 = TypeCode.Boolean Then i2 = -1 * Convert.ToInt32(obj2) Else i2 = Convert.ToInt32(obj2) End If Return (Convert.ToInt32(i1) And Convert.ToInt32(i2)) Case TypeCode.Int16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -