/// <summary>
        /// Converts an object to Avro generic record using reflection
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <param name="customValueGetter"></param>
        /// <returns></returns>
        public static AvroRecord ToAvroRecord <T>(
            this T obj,
            ICustomValueGetter customValueGetter = null) where T : class
        {
            if (obj == null)
            {
                return(null);
            }

            _customValueGetter = customValueGetter;

            return((AvroRecord)ToAvroRecord(obj, obj.GetType().GetAvroSchema()));
        }
        /// <summary>
        /// Converts an object to an Avro generic record based on the supplied schema
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="recordSchema"></param>
        /// <param name="customValueGetter"></param>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static AvroRecord ToAvroRecord <T>(
            this T obj,
            string recordSchema,
            ICustomValueGetter customValueGetter = null) where T : class
        {
            var typeSchema = new JsonSchemaBuilder().BuildSchema(recordSchema);

            if (!(typeSchema is RecordSchema))
            {
                throw new ApplicationException("Invalid record schema");
            }

            _customValueGetter = customValueGetter;

            return((AvroRecord)ToAvroRecord(obj, typeSchema));
        }