在我们采用反射动态调用一些方法时,常常涉及到类型的转换,直接判断类型是否相符有时不能判断调用方法是否合适
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; }