/// <summary> /// Check cache for MereFile object for T if one does not exist then creates, adds to cache, and returns it. /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static MereFile <T> CacheCheckFile <T>() where T : new() { var type = typeof(T); MereFile foundMereFile; if (MereFileCache.TryGetValue(type.TypeHandle, out foundMereFile)) { return((MereFile <T>)foundMereFile); } var mereTable = MereUtils.CacheCheck <T>(); var properties = TypeDescriptor.GetProperties(type).PropertyDescriptorCollectionToList(); var fields = properties.Where( w => (type.GetProperty(w.Name).GetCustomAttributes(typeof(MereFlatFileFieldAttribute), true).Any() || type.GetProperty(w.Name).GetCustomAttributes(typeof(MereDelimitedFileFieldAttribute), true).Any())) .Select( s => new { FlatFileFieldAttributes = type.GetProperty(s.Name) .GetCustomAttributes(typeof(MereFlatFileFieldAttribute), true) .Select(x => (MereFlatFileFieldAttribute)x), DelimitedFieldAttributes = type.GetProperty(s.Name) .GetCustomAttributes(typeof(MereDelimitedFileFieldAttribute), true) .Select(x => (MereDelimitedFileFieldAttribute)x), PropertyDescriptor = s }).ToList(); var mereFlatFileFields = new List <MereFileField>(); var mereDelimitedFileFields = new List <MereFileField>(); var mereFlatFileFieldRecords = new List <MereFile>(); var mereDelimitedFileFieldRecords = new List <MereFile>(); foreach (var field in fields) { var mereColumn = mereTable.AllMereColumns.GetMereColumnByPropertyName(field.PropertyDescriptor.Name); if (IsWritable(mereColumn.PropertyDescriptor.PropertyType)) { mereDelimitedFileFields.AddRange( field.DelimitedFieldAttributes.Select(fieldAttr => GetFileField(mereColumn, fieldAttr) )); mereFlatFileFields.AddRange( field.FlatFileFieldAttributes.Select(fieldAttr => GetFileField(mereColumn, fieldAttr) )); } else { //check if implements IEnumerable var isEnum = typeof(IEnumerable).IsAssignableFrom(field.PropertyDescriptor.PropertyType); var found = field.DelimitedFieldAttributes.Select(fieldAttr => { var enType = isEnum ? field.PropertyDescriptor.PropertyType.GetGenericArguments()[0] : field.PropertyDescriptor.PropertyType; var meth = typeof(MereFileUtils).GetMethod("CacheCheckSubRec") .MakeGenericMethod(new[] { enType }); var subMereFile = (MereFile)meth.Invoke(null, new[] { GetFileField(mereColumn, fieldAttr) }); return(subMereFile); }).ToList(); if (field.DelimitedFieldAttributes.Any()) { mereDelimitedFileFieldRecords.AddRange(found); } if (field.FlatFileFieldAttributes.Any()) { mereFlatFileFieldRecords.AddRange(found); } } } var fileTableAttrs = new { DelimitedFileTableTypeFormatAttrs = type.GetCustomAttributes(typeof(MereDelimitedFileTableTypeFormatAttribute), true) .Select(x => (MereFileTableTypeFormatAttribute)x), DelimitedFileTableAttr = (MereFileTableAttribute)type.GetCustomAttributes(typeof(MereDelimitedFileTableAttribute), true) .FirstOrDefault(), FlatFileTableAttr = (MereFileTableAttribute)type.GetCustomAttributes(typeof(MereFlatFileTableAttribute), true) .FirstOrDefault(), DelimitedFileTableTypeParsingAttrs = type.GetCustomAttributes(typeof(MereDelimitedFileTableTypeParsingAttribute), true) .Select(x => (MereFileTableTypeParsingAttribute)x), FlatFileTableTypeFormatAttrs = type.GetCustomAttributes(typeof(MereFlatFileTableTypeFormatAttribute), true) .Select(x => (MereFileTableTypeFormatAttribute)x), FlatFileTableTypeParsingAttrs = type.GetCustomAttributes(typeof(MereFlatFileTableTypeParsingAttribute), true) .Select(x => (MereFileTableTypeParsingAttribute)x), }; var mereFile = new MereFile <T> { FlatFileSubRecords = mereFlatFileFieldRecords, DelimitedSubRecords = mereDelimitedFileFieldRecords, DelimitedFileTableAttr = fileTableAttrs.DelimitedFileTableAttr, FlatFileTableAttr = fileTableAttrs.FlatFileTableAttr, DelimitedFields = mereDelimitedFileFields.ToList(), FlatFileFields = mereFlatFileFields.ToList(), DelimitedFileTableTypeFormats = fileTableAttrs.DelimitedFileTableTypeFormatAttrs.ToDictionary(x => x.TypeToFormat, x => x.ToStringFormat), FlatFileTableTypeFormats = fileTableAttrs.FlatFileTableTypeFormatAttrs.ToDictionary(x => x.TypeToFormat, x => x.ToStringFormat), DelimitedFileTableTypeParsingOptions = fileTableAttrs.DelimitedFileTableTypeParsingAttrs.Where(x => x.TypeToFormat != null).ToDictionary(x => x.TypeToFormat, x => x.FileFieldParsingOptions), FlatFileTableTypeParsingOptions = fileTableAttrs.FlatFileTableTypeParsingAttrs.Where(x => x.TypeToFormat != null).ToDictionary(x => x.TypeToFormat, x => x.FileFieldParsingOptions), DelimitedFileTableParsingOptions = fileTableAttrs.DelimitedFileTableTypeParsingAttrs.Where(x => x.TypeToFormat == null).SelectMany(x => x.FileFieldParsingOptions).ToList(), FlatFileTableParsingOptions = fileTableAttrs.FlatFileTableTypeParsingAttrs.Where(x => x.TypeToFormat == null).SelectMany(x => x.FileFieldParsingOptions).ToList() }; MereFileCache.TryAdd(type.TypeHandle, mereFile); return(mereFile); }
public static void WriteToFlatFile <T>(this IEnumerable <T> toWrite, string filePath, bool append) where T : new() { MereFile.WriteToFlatFile(toWrite, filePath, append); }