protected override MapAccess GetMapAccess(MapSchema readerSchema) { return(new SpecificMapAccess(readerSchema)); }
/// <summary> /// Gets the type for the specified schema /// </summary> /// <param name="schema"></param> /// <returns></returns> /// <exception cref="AvroException"> /// No type found matching the given name. /// </exception> public Type GetType(Schema schema) { switch (schema.Tag) { case Schema.Type.Null: break; case Schema.Type.Boolean: return(typeof(bool)); case Schema.Type.Int: return(typeof(int)); case Schema.Type.Long: return(typeof(long)); case Schema.Type.Float: return(typeof(float)); case Schema.Type.Double: return(typeof(double)); case Schema.Type.Bytes: return(typeof(byte[])); case Schema.Type.String: return(typeof(string)); case Schema.Type.Union: { if (schema is UnionSchema unSchema && unSchema.Count == 2) { Schema s1 = unSchema.Schemas[0]; Schema s2 = unSchema.Schemas[1]; // Nullable ? Type itemType = null; if (s1.Tag == Schema.Type.Null) { itemType = GetType(s2); } else if (s2.Tag == Schema.Type.Null) { itemType = GetType(s1); } if (itemType != null) { if (itemType.IsValueType && !itemType.IsEnum) { try { return(GenericNullableType.MakeGenericType(itemType)); } catch { } } return(itemType); } } return(typeof(object)); } case Schema.Type.Array: { ArraySchema arrSchema = schema as ArraySchema; Type itemSchema = GetType(arrSchema.ItemSchema); return(GenericListType.MakeGenericType(itemSchema)); } case Schema.Type.Map: { MapSchema mapSchema = schema as MapSchema; Type itemSchema = GetType(mapSchema.ValueSchema); return(GenericMapType.MakeGenericType(typeof(string), itemSchema)); } case Schema.Type.Enumeration: case Schema.Type.Record: case Schema.Type.Fixed: case Schema.Type.Error: { // Should all be named types if (schema is NamedSchema named) { return(FindType(named.Fullname)); } break; } } // Fallback return(FindType(schema.Name)); }