/// <summary>
        ///     Convert Csv file by metadata description
        ///           use only properties ( get; set; ) field
        ///
        ///    Metadata File as :
        ///        [
        ///          {
        ///         "Column":0,
        ///         "Field":"FL_ID"
        ///             },
        ///         {
        ///         "Column":1,
        ///         "Field":"FL_Dep_Hour"
        ///             },
        ///         {
        ///         "Column":2,
        ///         "Field":"FL_Arrv_Hour"
        ///             }
        ///         ]
        ///
        ///    run as :
        ///            CsvConverter convert = new CsvConverter();
        ///            List<FlightDetail> flight = convert.CsvConvert<FlightDetail>(@"FlList.txt", @"FlList.json");
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="CsvFileName"></param>
        /// <param name="jsonMetoDataFileName"></param>
        /// <returns></returns>
        public List <T> CsvConvert <T>(String CsvFileName, String jsonMetoDataFileName)
        {
            String   jsonString = File.ReadAllText(jsonMetoDataFileName, Encoding.UTF8);
            dynamic  metoData   = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString, typeof(List <MetodataItem>));
            List <T> ret        = new List <T>();


            var bindingFlags = BindingFlags.Public |
                               BindingFlags.Instance;
            var fields = typeof(T).GetFields(bindingFlags);

            var properties = typeof(T).GetProperties();

            T t = (T)Activator.CreateInstance(typeof(T), new object[] { });

            String line = "";

            using (var fs = new FileStream(CsvFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (StreamReader fileReader = new System.IO.StreamReader(fs, System.Text.Encoding.UTF8, false))
                {
                    while ((line = fileReader.ReadLine()) != null)
                    {
                        String[] fieldsItem = line.Split(";");
                        T        Obj        = (T)Activator.CreateInstance(typeof(T), new object[] { });

                        if (properties.Length > 0)
                        {
                            foreach (var item in metoData)
                            {
                                if (item.Column < fieldsItem.Length)
                                {
                                    String       value        = fieldsItem[item.Column];
                                    PropertyInfo propertyInfo = Obj.GetType().GetProperty(item.Field);
                                    if (propertyInfo != null)
                                    {
                                        try
                                        {
                                            object safeValue = MyConvert.ChangeType(value, propertyInfo.PropertyType);
                                            propertyInfo.SetValue(Obj, safeValue, null);
                                        }
                                        catch (Exception ex)
                                        {
                                            // TODO - Exception - check field type
                                            MyLogger.LogDebug($"Error: File - {CsvFileName} {item} field - {propertyInfo.Name} {ex.Message} ");
                                        }
                                    }
                                }
                            }
                        }


                        ret.Add(Obj);
                    }
                }
            }



            return(ret);
        }