|
2 | 2 | using System.Collections; |
3 | 3 | using System.Collections.Generic; |
4 | 4 | using System.IO; |
5 | | -using System.Reflection; |
6 | | -using System.Linq; |
7 | | - |
8 | 5 | using ServiceStack.Text.Json; |
9 | 6 | using ServiceStack.Text.Jsv; |
10 | 7 |
|
@@ -87,19 +84,25 @@ internal static void WriteItemSeperatorIfRanOnce(TextWriter writer, ref bool ran |
87 | 84 |
|
88 | 85 | internal static bool ShouldUseDefaultToStringMethod(Type type) |
89 | 86 | { |
90 | | - return type == typeof(byte) || type == typeof(byte?) |
91 | | - || type == typeof(short) || type == typeof(short?) |
92 | | - || type == typeof(ushort) || type == typeof(ushort?) |
93 | | - || type == typeof(int) || type == typeof(int?) |
94 | | - || type == typeof(uint) || type == typeof(uint?) |
95 | | - || type == typeof(long) || type == typeof(long?) |
96 | | - || type == typeof(ulong) || type == typeof(ulong?) |
97 | | - || type == typeof(bool) || type == typeof(bool?) |
98 | | - || type == typeof(DateTime) || type == typeof(DateTime?) |
99 | | - || type == typeof(Guid) || type == typeof(Guid?) |
100 | | - || type == typeof(float) || type == typeof(float?) |
101 | | - || type == typeof(double) || type == typeof(double?) |
102 | | - || type == typeof(decimal) || type == typeof(decimal?); |
| 87 | + var underlyingType = Nullable.GetUnderlyingType(type) ?? type; |
| 88 | + switch (underlyingType.GetTypeCode()) |
| 89 | + { |
| 90 | + case TypeCode.SByte: |
| 91 | + case TypeCode.Byte: |
| 92 | + case TypeCode.Int16: |
| 93 | + case TypeCode.UInt16: |
| 94 | + case TypeCode.Int32: |
| 95 | + case TypeCode.UInt32: |
| 96 | + case TypeCode.Int64: |
| 97 | + case TypeCode.UInt64: |
| 98 | + case TypeCode.Single: |
| 99 | + case TypeCode.Double: |
| 100 | + case TypeCode.Decimal: |
| 101 | + case TypeCode.DateTime: |
| 102 | + return true; |
| 103 | + } |
| 104 | + |
| 105 | + return underlyingType == typeof(Guid); |
103 | 106 | } |
104 | 107 |
|
105 | 108 | public static ITypeSerializer GetTypeSerializer<TSerializer>() |
@@ -171,71 +174,77 @@ public JsWriter() |
171 | 174 |
|
172 | 175 | public WriteObjectDelegate GetValueTypeToStringMethod(Type type) |
173 | 176 | { |
174 | | - if (type == typeof(char) || type == typeof(char?)) |
175 | | - return Serializer.WriteChar; |
176 | | - if (type == typeof(int) || type == typeof(int?)) |
177 | | - return Serializer.WriteInt32; |
178 | | - if (type == typeof(long) || type == typeof(long?)) |
179 | | - return Serializer.WriteInt64; |
180 | | - if (type == typeof(ulong) || type == typeof(ulong?)) |
181 | | - return Serializer.WriteUInt64; |
182 | | - if (type == typeof(uint) || type == typeof(uint?)) |
183 | | - return Serializer.WriteUInt32; |
| 177 | + var underlyingType = Nullable.GetUnderlyingType(type); |
| 178 | + var isNullable = underlyingType != null; |
| 179 | + if (underlyingType == null) |
| 180 | + underlyingType = type; |
184 | 181 |
|
185 | | - if (type == typeof(byte) || type == typeof(byte?)) |
186 | | - return Serializer.WriteByte; |
187 | | - |
188 | | - if (type == typeof(short) || type == typeof(short?)) |
189 | | - return Serializer.WriteInt16; |
190 | | - if (type == typeof(ushort) || type == typeof(ushort?)) |
191 | | - return Serializer.WriteUInt16; |
| 182 | + if (!underlyingType.IsEnum()) |
| 183 | + { |
| 184 | + var typeCode = underlyingType.GetTypeCode(); |
192 | 185 |
|
193 | | - if (type == typeof(bool) || type == typeof(bool?)) |
194 | | - return Serializer.WriteBool; |
| 186 | + if (typeCode == TypeCode.Char) |
| 187 | + return Serializer.WriteChar; |
| 188 | + if (typeCode == TypeCode.Int32) |
| 189 | + return Serializer.WriteInt32; |
| 190 | + if (typeCode == TypeCode.Int64) |
| 191 | + return Serializer.WriteInt64; |
| 192 | + if (typeCode == TypeCode.UInt64) |
| 193 | + return Serializer.WriteUInt64; |
| 194 | + if (typeCode == TypeCode.UInt32) |
| 195 | + return Serializer.WriteUInt32; |
195 | 196 |
|
196 | | - if (type == typeof(DateTime)) |
197 | | - return Serializer.WriteDateTime; |
| 197 | + if (typeCode == TypeCode.Byte) |
| 198 | + return Serializer.WriteByte; |
198 | 199 |
|
199 | | - if (type == typeof(DateTime?)) |
200 | | - return Serializer.WriteNullableDateTime; |
| 200 | + if (typeCode == TypeCode.Int16) |
| 201 | + return Serializer.WriteInt16; |
| 202 | + if (typeCode == TypeCode.UInt16) |
| 203 | + return Serializer.WriteUInt16; |
201 | 204 |
|
202 | | - if (type == typeof(DateTimeOffset)) |
203 | | - return Serializer.WriteDateTimeOffset; |
| 205 | + if (typeCode == TypeCode.Boolean) |
| 206 | + return Serializer.WriteBool; |
204 | 207 |
|
205 | | - if (type == typeof(DateTimeOffset?)) |
206 | | - return Serializer.WriteNullableDateTimeOffset; |
| 208 | + if (typeCode == TypeCode.Single) |
| 209 | + return Serializer.WriteFloat; |
207 | 210 |
|
208 | | - if (type == typeof(TimeSpan)) |
209 | | - return Serializer.WriteTimeSpan; |
| 211 | + if (typeCode == TypeCode.Double) |
| 212 | + return Serializer.WriteDouble; |
210 | 213 |
|
211 | | - if (type == typeof(TimeSpan?)) |
212 | | - return Serializer.WriteNullableTimeSpan; |
| 214 | + if (typeCode == TypeCode.Decimal) |
| 215 | + return Serializer.WriteDecimal; |
213 | 216 |
|
214 | | - if (type == typeof(Guid)) |
215 | | - return Serializer.WriteGuid; |
| 217 | + if (typeCode == TypeCode.DateTime) |
| 218 | + if (isNullable) |
| 219 | + return Serializer.WriteNullableDateTime; |
| 220 | + else |
| 221 | + return Serializer.WriteDateTime; |
216 | 222 |
|
217 | | - if (type == typeof(Guid?)) |
218 | | - return Serializer.WriteNullableGuid; |
| 223 | + if (type == typeof(DateTimeOffset)) |
| 224 | + return Serializer.WriteDateTimeOffset; |
219 | 225 |
|
220 | | - if (type == typeof(float) || type == typeof(float?)) |
221 | | - return Serializer.WriteFloat; |
| 226 | + if (type == typeof(DateTimeOffset?)) |
| 227 | + return Serializer.WriteNullableDateTimeOffset; |
222 | 228 |
|
223 | | - if (type == typeof(double) || type == typeof(double?)) |
224 | | - return Serializer.WriteDouble; |
| 229 | + if (type == typeof(TimeSpan)) |
| 230 | + return Serializer.WriteTimeSpan; |
225 | 231 |
|
226 | | - if (type == typeof(decimal) || type == typeof(decimal?)) |
227 | | - return Serializer.WriteDecimal; |
| 232 | + if (type == typeof(TimeSpan?)) |
| 233 | + return Serializer.WriteNullableTimeSpan; |
228 | 234 |
|
229 | | - if (type.IsUnderlyingEnum()) |
230 | | - return type.FirstAttribute<FlagsAttribute>() != null |
231 | | - ? (WriteObjectDelegate)Serializer.WriteEnumFlags |
232 | | - : Serializer.WriteEnum; |
| 235 | + if (type == typeof(Guid)) |
| 236 | + return Serializer.WriteGuid; |
233 | 237 |
|
234 | | - Type nullableType; |
235 | | - if ((nullableType = Nullable.GetUnderlyingType(type)) != null && nullableType.IsEnum()) |
236 | | - return nullableType.FirstAttribute<FlagsAttribute>() != null |
237 | | - ? (WriteObjectDelegate)Serializer.WriteEnumFlags |
238 | | - : Serializer.WriteEnum; |
| 238 | + if (type == typeof(Guid?)) |
| 239 | + return Serializer.WriteNullableGuid; |
| 240 | + } |
| 241 | + else |
| 242 | + { |
| 243 | + if (underlyingType.IsEnum()) |
| 244 | + return type.FirstAttribute<FlagsAttribute>() != null |
| 245 | + ? (WriteObjectDelegate)Serializer.WriteEnumFlags |
| 246 | + : Serializer.WriteEnum; |
| 247 | + } |
239 | 248 |
|
240 | 249 | if (type.HasInterface(typeof(IFormattable))) |
241 | 250 | return Serializer.WriteFormattableObjectString; |
|
0 commit comments