private void addType(List <byte> result, Type type) { if (type.IsArray) { result.Add((byte)AdditionalTypeCodes._ArrayTypeCode); addType(result, type.GetElementType()); return; } if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>)) { result.Add((byte)AdditionalTypeCodes._BoxiedTypeCode); addType(result, type.GetGenericArguments()[0]); return; } var typeId = Type.GetTypeCode(type); if (typeId == TypeCode.Object) { if (type != typeof(object)) { if (_types.TryGetId(type, out var id)) { typeId = AdditionalTypeCodes._RegisteredTypeCode; result.Add((byte)typeId); addInt32(result, (int)id); } else { typeId = AdditionalTypeCodes._UnregisteredTypeCode; result.Add((byte)typeId); addString(result, type.FullName); } return; } } result.Add((byte)typeId); }
public bool TryGetId(Type type, out uint id) { lock (_sync) return(_typeToId.TryGetValue(type, out id) || (_parentMap != null && _parentMap.TryGetId(type, out id))); }