在我們採用反射動態調用一些方法時,常常涉及到類型的轉換,直接判斷類型是否相符有時不能判斷調用方法是否合適
C#中,有些類型是可以隱式轉換的,我整理了這些可以隱式轉換的類型,供大家參考
static private bool CanConvert(Type from, Type to) { if (from.IsPrimitive && to.IsPrimitive) { TypeCode typeCodeFrom = Type.GetTypeCode(from); TypeCode typeCodeTo = Type.GetTypeCode(to); if (typeCodeFrom == typeCodeTo) return true; if (typeCodeFrom == TypeCode.Char) switch (typeCodeTo) { case TypeCode.UInt16: return true; case TypeCode.UInt32: return true; case TypeCode.Int32: return true; case TypeCode.UInt64: return true; case TypeCode.Int64: return true; case TypeCode.Single: return true; case TypeCode.Double: return true; default: return false; } // Possible conversions from Byte follow. if (typeCodeFrom == TypeCode.Byte) switch (typeCodeTo) { case TypeCode.Char: return true; case TypeCode.UInt16: return true; case TypeCode.Int16: return true; case TypeCode.UInt32: return true; case TypeCode.Int32: return true; case TypeCode.UInt64: return true; case TypeCode.Int64: return true; case TypeCode.Single: return true; case TypeCode.Double: return true; default: return false; } // Possible conversions from SByte follow. if (typeCodeFrom == TypeCode.SByte) switch (typeCodeTo) { case TypeCode.Int16: return true; case TypeCode.Int32: return true; case TypeCode.Int64: return true; case TypeCode.Single: return true; case TypeCode.Double: return true; default: return false; } // Possible conversions from UInt16 follow. if (typeCodeFrom == TypeCode.UInt16) switch (typeCodeTo) { case TypeCode.UInt32: return true; case TypeCode.Int32: return true; case TypeCode.UInt64: return true; case TypeCode.Int64: return true; case TypeCode.Single: return true; case TypeCode.Double: return true; default: return false; } // Possible conversions from Int16 follow. if (typeCodeFrom == TypeCode.Int16) switch (typeCodeTo) { case TypeCode.Int32: return true; case TypeCode.Int64: return true; case TypeCode.Single: return true; case TypeCode.Double: return true; default: return false; } // Possible conversions from UInt32 follow. if (typeCodeFrom == TypeCode.UInt32) switch (typeCodeTo) { case TypeCode.UInt64: return true; case TypeCode.Int64: return true; case TypeCode.Single: return true; case TypeCode.Double: return true; default: return false; } // Possible conversions from Int32 follow. if (typeCodeFrom == TypeCode.Int32) switch (typeCodeTo) { case TypeCode.Int64: return true; case TypeCode.Single: return true; case TypeCode.Double: return true; default: return false; } // Possible conversions from UInt64 follow. if (typeCodeFrom == TypeCode.UInt64) switch (typeCodeTo) { case TypeCode.Single: return true; case TypeCode.Double: return true; default: return false; } // Possible conversions from Int64 follow. if (typeCodeFrom == TypeCode.Int64) switch (typeCodeTo) { case TypeCode.Single: return true; case TypeCode.Double: return true; default: return false; } // Possible conversions from Single follow. if (typeCodeFrom == TypeCode.Single) switch (typeCodeTo) { case TypeCode.Double: return true; default: return false; } } return false; }