如何将NSNumber转换为.NET Object?未知类型场景该如何处理?
如何将未知类型的NSNumber转换为装箱的.NET Object?
在处理.NET iOS相关项目(如net6.0-ios、net6.0-maccatalyst、Xamarin、MAUI等)时,若你不知道NSNumber的具体类型,想要将其转换为装箱了实际.NET值类型(如bool、int、double等)的object,可以参考以下两种实现方式:
方式一:通过GetTypeCode()匹配转换
利用NSNumber的GetTypeCode()方法获取其对应的.NET类型码,再针对性转换为具体值类型,最终自动装箱为object:
public static object ConvertNSNumberToBoxedValue(NSNumber number) { if (number == null) return null; var typeCode = number.GetTypeCode(); return typeCode switch { TypeCode.Boolean => number.BooleanValue, TypeCode.Int16 => number.Int16Value, TypeCode.UInt16 => number.UInt16Value, TypeCode.Int32 => number.Int32Value, TypeCode.UInt32 => number.UInt32Value, TypeCode.Int64 => number.Int64Value, TypeCode.UInt64 => number.UInt64Value, TypeCode.Single => number.FloatValue, TypeCode.Double => number.DoubleValue, TypeCode.Byte => (byte)number.UInt8Value, _ => number.DoubleValue // 针对未覆盖的类型,默认回退为Double }; }
方式二:使用Convert.ChangeType()简化实现
借助.NET内置的Convert.ChangeType()方法,结合GetTypeCode()的结果自动完成类型转换:
public static object ConvertNSNumberToBoxedValue(NSNumber number) { if (number == null) return null; var targetTypeCode = number.GetTypeCode(); return Convert.ChangeType(number, targetTypeCode); }
注意事项
NSNumber的GetTypeCode()会准确返回其内部存储值对应的.NETTypeCode,确保转换的精准性;- 若遇到一些边缘类型(比如罕见的数值类型),可以根据业务需求调整默认回退逻辑。
内容的提问来源于stack exchange,提问作者Matt Johnson-Pint
相关产品推荐
相关产品推荐

