213 {
214 if (type.IsInstanceOfType(tag))
215 return tag;
216
219 if (tag == null)
221
222 return serializer.Deserialize(tag);
223 }
224
225
226 if (tag == null) {
227 if (type.GetGenericArguments().Length == 0)
229
230 if (type.GetGenericTypeDefinition() == typeof(Nullable<>))
231 return null;
232 }
233
234
235 if ((tag == null || tag is IList) &&
236 type.GetGenericArguments().Length == 1) {
237 var elemType = type.GetGenericArguments()[0];
238 var newListType = typeof(List<>).MakeGenericType(elemType);
239 if (type.IsAssignableFrom(newListType)) {
240 if (tag == null)
241 return newListType.GetConstructor(new Type[0]).Invoke(new object[0]);
242
243 if (
TagSerializer.TryGetSerializer(elemType, out serializer))
244 return serializer.DeserializeList((IList)tag);
245
246
247 var oldList = (IList)tag;
248 var newList = (IList)newListType.GetConstructor(new[] { typeof(int) }).Invoke(new object[] { oldList.Count });
249 foreach (var elem in oldList)
251
252 return newList;
253 }
254 }
255
256 if (tag == null)
257 throw new IOException($
"Invalid NBT payload type '{type}'");
258
259 throw new InvalidCastException($"Unable to cast object of type '{tag.GetType()}' to type '{type}'");
260 }
abstract object Default()
static int GetPayloadId(Type t)
static object Deserialize(Type type, object tag)
static PayloadHandler GetHandler(int id)