|
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