private void DiscoverRecordFields(Type recordType) { if (!IsDynamicObject) //recordType != typeof(ExpandoObject)) { CSVRecordFieldConfigurations.Clear(); if (ChoTypeDescriptor.GetProperties(recordType).Where(pd => pd.Attributes.OfType <ChoCSVRecordFieldAttribute>().Any()).Any()) { foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType).Where(pd => pd.Attributes.OfType <ChoCSVRecordFieldAttribute>().Any())) { //if (!pd.PropertyType.IsSimple()) // throw new ChoRecordConfigurationException("Property '{0}' is not a simple type.".FormatString(pd.Name)); var obj = new ChoCSVRecordFieldConfiguration(pd.Name, pd.Attributes.OfType <ChoCSVRecordFieldAttribute>().First()); obj.FieldType = pd.PropertyType; CSVRecordFieldConfigurations.Add(obj); } } else { int position = 0; foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType)) { //if (!pd.PropertyType.IsSimple()) // throw new ChoRecordConfigurationException("Property '{0}' is not a simple type.".FormatString(pd.Name)); var obj = new ChoCSVRecordFieldConfiguration(pd.Name, ++position); obj.FieldType = pd.PropertyType; CSVRecordFieldConfigurations.Add(obj); } } } }
public ChoCSVRecordFieldConfiguration this[string name] { get { return(CSVRecordFieldConfigurations.Where(i => i.Name == name).FirstOrDefault()); } }
internal ChoCSVRecordFieldConfiguration GetFieldConfiguration(string fn) { if (!CSVRecordFieldConfigurations.Any(fc => fc.Name == fn)) { CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration(fn)); } return(CSVRecordFieldConfigurations.First(fc => fc.Name == fn)); }
internal ChoCSVRecordFieldConfiguration GetFieldConfiguration(string fn, ChoCSVRecordFieldAttribute attr = null, Attribute[] otherAttrs = null) { if (!CSVRecordFieldConfigurations.Any(fc => fc.Name == fn)) { CSVRecordFieldConfigurations.Add(new ChoCSVRecordFieldConfiguration(fn, attr, otherAttrs)); } return(CSVRecordFieldConfigurations.First(fc => fc.Name == fn)); }
private void DiscoverRecordFields(Type recordType, ref int pos, bool clear = true) { if (recordType == null) { return; } if (clear) { //SupportsMultiRecordTypes = false; CSVRecordFieldConfigurations.Clear(); } //else //SupportsMultiRecordTypes = true; DiscoverRecordFields(recordType, ref pos, null, ChoTypeDescriptor.GetProperties(recordType).Where(pd => pd.Attributes.OfType <ChoCSVRecordFieldAttribute>().Any()).Any()); }
public override void Validate(object state) { base.Validate(state); if (Delimiter.IsNull()) { throw new ChoRecordConfigurationException("Delimiter can't be null or whitespace."); } if (Delimiter == EOLDelimiter) { throw new ChoRecordConfigurationException("Delimiter [{0}] can't be same as EODDelimiter [{1}]".FormatString(Delimiter, EOLDelimiter)); } if (Delimiter.Contains(QuoteChar)) { throw new ChoRecordConfigurationException("QuoteChar [{0}] can't be one of Delimiter characters [{1}]".FormatString(QuoteChar, Delimiter)); } if (Comments != null && Comments.Contains(Delimiter)) { throw new ChoRecordConfigurationException("One of the Comments contains Delimiter. Not allowed."); } //Validate Header if (FileHeaderConfiguration != null) { if (FileHeaderConfiguration.FillChar != null) { if (FileHeaderConfiguration.FillChar.Value == ChoCharEx.NUL) { throw new ChoRecordConfigurationException("Invalid '{0}' FillChar specified.".FormatString(FileHeaderConfiguration.FillChar)); } if (Delimiter.Contains(FileHeaderConfiguration.FillChar.Value)) { throw new ChoRecordConfigurationException("FillChar [{0}] can't be one of Delimiter characters [{1}]".FormatString(FileHeaderConfiguration.FillChar, Delimiter)); } if (EOLDelimiter.Contains(FileHeaderConfiguration.FillChar.Value)) { throw new ChoRecordConfigurationException("FillChar [{0}] can't be one of EOLDelimiter characters [{1}]".FormatString(FileHeaderConfiguration.FillChar.Value, EOLDelimiter)); } if ((from comm in Comments where comm.Contains(FileHeaderConfiguration.FillChar.Value.ToString()) select comm).Any()) { throw new ChoRecordConfigurationException("One of the Comments contains FillChar. Not allowed."); } } } string[] headers = state as string[]; if (AutoDiscoverColumns && CSVRecordFieldConfigurations.Count == 0) { if (headers != null) { int index = 0; CSVRecordFieldConfigurations = (from header in headers select new ChoCSVRecordFieldConfiguration(header, ++index)).ToList(); } else { MapRecordFields(RecordType); } } else { int maxFieldPos = CSVRecordFieldConfigurations.Max(r => r.FieldPosition); foreach (var fieldConfig in CSVRecordFieldConfigurations) { if (fieldConfig.FieldPosition > 0) { continue; } fieldConfig.FieldPosition = ++maxFieldPos; } } if (CSVRecordFieldConfigurations.Count > 0) { MaxFieldPosition = CSVRecordFieldConfigurations.Max(r => r.FieldPosition); } else { throw new ChoRecordConfigurationException("No record fields specified."); } //Validate each record field foreach (var fieldConfig in CSVRecordFieldConfigurations) { fieldConfig.Validate(this); } //Check if any field has 0 if (CSVRecordFieldConfigurations.Where(i => i.FieldPosition <= 0).Count() > 0) { throw new ChoRecordConfigurationException("Some fields contain invalid field position. All field positions must be > 0."); } //Check field position for duplicate int[] dupPositions = CSVRecordFieldConfigurations.GroupBy(i => i.FieldPosition) .Where(g => g.Count() > 1) .Select(g => g.Key).ToArray(); if (dupPositions.Length > 0) { throw new ChoRecordConfigurationException("Duplicate field position(s) [Index: {0}] found.".FormatString(String.Join(",", dupPositions))); } if (!FileHeaderConfiguration.HasHeaderRecord) { } else { //Check if any field has empty names if (CSVRecordFieldConfigurations.Where(i => i.FieldName.IsNullOrWhiteSpace()).Count() > 0) { throw new ChoRecordConfigurationException("Some fields has empty field name specified."); } //Check field names for duplicate string[] dupFields = CSVRecordFieldConfigurations.GroupBy(i => i.FieldName, FileHeaderConfiguration.StringComparer) .Where(g => g.Count() > 1) .Select(g => g.Key).ToArray(); if (dupFields.Length > 0) { throw new ChoRecordConfigurationException("Duplicate field name(s) [Name: {0}] found.".FormatString(String.Join(",", dupFields))); } } RecordFieldConfigurationsDict = CSVRecordFieldConfigurations.OrderBy(i => i.FieldPosition).Where(i => !i.Name.IsNullOrWhiteSpace()).ToDictionary(i => i.Name, FileHeaderConfiguration.StringComparer); RecordFieldConfigurationsDict2 = CSVRecordFieldConfigurations.OrderBy(i => i.FieldPosition).Where(i => !i.FieldName.IsNullOrWhiteSpace()).ToDictionary(i => i.FieldName, FileHeaderConfiguration.StringComparer); AlternativeKeys = RecordFieldConfigurationsDict2.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Name, FileHeaderConfiguration.StringComparer); FCArray = RecordFieldConfigurationsDict.ToArray(); LoadNCacheMembers(CSVRecordFieldConfigurations); }
public override void Validate(object state) { base.Validate(state); if (Delimiter.IsNull()) { throw new ChoRecordConfigurationException("Delimiter can't be null or whitespace."); } if (Delimiter == EOLDelimiter) { throw new ChoRecordConfigurationException("Delimiter [{0}] can't be same as EODDelimiter [{1}]".FormatString(Delimiter, EOLDelimiter)); } if (Delimiter.Contains(QuoteChar)) { throw new ChoRecordConfigurationException("QuoteChar [{0}] can't be one of Delimiter characters [{1}]".FormatString(QuoteChar, Delimiter)); } if (Comments != null && Comments.Contains(Delimiter)) { throw new ChoRecordConfigurationException("One of the Comments contains Delimiter. Not allowed."); } //Validate Header if (FileHeaderConfiguration != null) { if (FileHeaderConfiguration.FillChar != null) { ValidateChar(FileHeaderConfiguration.FillChar.Value, nameof(FileHeaderConfiguration.FillChar)); } } string[] headers = state as string[]; if (AutoDiscoverColumns && CSVRecordFieldConfigurations.Count == 0) { if (headers != null && IsDynamicObject) { int index = 0; CSVRecordFieldConfigurations = (from header in headers select new ChoCSVRecordFieldConfiguration(header, ++index)).ToList(); } else { MapRecordFields(RecordType); } } else { int maxFieldPos = CSVRecordFieldConfigurations.Max(r => r.FieldPosition); foreach (var fieldConfig in CSVRecordFieldConfigurations) { if (fieldConfig.FieldPosition > 0) { continue; } fieldConfig.FieldPosition = ++maxFieldPos; } } if (CSVRecordFieldConfigurations.Count > 0) { MaxFieldPosition = CSVRecordFieldConfigurations.Max(r => r.FieldPosition); } else { throw new ChoRecordConfigurationException("No record fields specified."); } //Validate each record field foreach (var fieldConfig in CSVRecordFieldConfigurations) { fieldConfig.Validate(this); } //Check if any field has 0 if (CSVRecordFieldConfigurations.Where(i => i.FieldPosition <= 0).Count() > 0) { throw new ChoRecordConfigurationException("Some fields contain invalid field position. All field positions must be > 0."); } //Check field position for duplicate int[] dupPositions = CSVRecordFieldConfigurations.GroupBy(i => i.FieldPosition) .Where(g => g.Count() > 1) .Select(g => g.Key).ToArray(); if (dupPositions.Length > 0) { throw new ChoRecordConfigurationException("Duplicate field position(s) [Index: {0}] found.".FormatString(String.Join(",", dupPositions))); } if (!FileHeaderConfiguration.HasHeaderRecord) { } else { //Check if any field has empty names if (CSVRecordFieldConfigurations.Where(i => i.FieldName.IsNullOrWhiteSpace()).Count() > 0) { throw new ChoRecordConfigurationException("Some fields has empty field name specified."); } //Check field names for duplicate string[] dupFields = CSVRecordFieldConfigurations.GroupBy(i => i.FieldName, FileHeaderConfiguration.StringComparer) .Where(g => g.Count() > 1) .Select(g => g.Key).ToArray(); if (dupFields.Length > 0) { throw new ChoRecordConfigurationException("Duplicate field name(s) [Name: {0}] found.".FormatString(String.Join(",", dupFields))); } } PIDict = new Dictionary <string, System.Reflection.PropertyInfo>(); PDDict = new Dictionary <string, PropertyDescriptor>(); foreach (var fc in CSVRecordFieldConfigurations) { if (fc.PropertyDescriptor == null) { fc.PropertyDescriptor = ChoTypeDescriptor.GetProperties(RecordType).Where(pd => pd.Name == fc.Name).FirstOrDefault(); } if (fc.PropertyDescriptor == null) { continue; } PIDict.Add(fc.PropertyDescriptor.Name, fc.PropertyDescriptor.ComponentType.GetProperty(fc.PropertyDescriptor.Name)); PDDict.Add(fc.PropertyDescriptor.Name, fc.PropertyDescriptor); } RecordFieldConfigurationsDict = CSVRecordFieldConfigurations.OrderBy(i => i.FieldPosition).Where(i => !i.Name.IsNullOrWhiteSpace()).ToDictionary(i => i.Name, FileHeaderConfiguration.StringComparer); RecordFieldConfigurationsDict2 = CSVRecordFieldConfigurations.OrderBy(i => i.FieldPosition).Where(i => !i.FieldName.IsNullOrWhiteSpace()).ToDictionary(i => i.FieldName, FileHeaderConfiguration.StringComparer); if (IsDynamicObject) { AlternativeKeys = RecordFieldConfigurationsDict2.ToDictionary(kvp => kvp.Key, kvp => { if (kvp.Key == kvp.Value.Name) { return(kvp.Value.Name.ToValidVariableName()); } else { return(kvp.Value.Name); } }, FileHeaderConfiguration.StringComparer); } else { AlternativeKeys = RecordFieldConfigurationsDict2.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Name, FileHeaderConfiguration.StringComparer); } FCArray = RecordFieldConfigurationsDict.ToArray(); LoadNCacheMembers(CSVRecordFieldConfigurations); if (Sanitize) { ValidateChar(InjectionEscapeChar, nameof(InjectionEscapeChar)); foreach (char injectionChar in InjectionChars) { ValidateChar(injectionChar, nameof(InjectionChars)); if (injectionChar.ToString().IsAlphaNumeric()) { throw new ChoRecordConfigurationException("Invalid '{0}' injection char specified.".FormatString(injectionChar)); } } } if (RecordTypeConfiguration != null) { if (RecordSelector == null && RecordTypeCodeExtractor == null) { } } }
private void DiscoverRecordFields(Type recordType, ref int position, string declaringMember = null, bool optIn = false) { if (!recordType.IsDynamicType()) { Type pt = null; if (optIn) //ChoTypeDescriptor.GetProperties(recordType).Where(pd => pd.Attributes.OfType<ChoCSVRecordFieldAttribute>().Any()).Any()) { foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType)) { pt = pd.PropertyType.GetUnderlyingType(); if (!pt.IsSimple() && !typeof(IEnumerable).IsAssignableFrom(pt)) { DiscoverRecordFields(pt, ref position, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn); } else if (pd.Attributes.OfType <ChoCSVRecordFieldAttribute>().Any()) { var obj = new ChoCSVRecordFieldConfiguration(pd.Name, pd.Attributes.OfType <ChoCSVRecordFieldAttribute>().First(), pd.Attributes.OfType <Attribute>().ToArray()); obj.FieldType = pt; obj.PropertyDescriptor = pd; obj.DeclaringMember = declaringMember == null ? null : "{0}.{1}".FormatString(declaringMember, pd.Name); if (!CSVRecordFieldConfigurations.Any(c => c.Name == pd.Name)) { CSVRecordFieldConfigurations.Add(obj); } } } } else { foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType)) { pt = pd.PropertyType.GetUnderlyingType(); if (pt != typeof(object) && !pt.IsSimple() && !typeof(IEnumerable).IsAssignableFrom(pt)) { DiscoverRecordFields(pt, ref position, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn); } else { var obj = new ChoCSVRecordFieldConfiguration(pd.Name, ++position); obj.FieldType = pd.PropertyType; // pt; obj.PropertyDescriptor = pd; obj.DeclaringMember = declaringMember == null ? null : "{0}.{1}".FormatString(declaringMember, pd.Name); StringLengthAttribute slAttr = pd.Attributes.OfType <StringLengthAttribute>().FirstOrDefault(); if (slAttr != null && slAttr.MaximumLength > 0) { obj.Size = slAttr.MaximumLength; } DisplayAttribute dpAttr = pd.Attributes.OfType <DisplayAttribute>().FirstOrDefault(); if (dpAttr != null) { if (!dpAttr.ShortName.IsNullOrWhiteSpace()) { obj.FieldName = dpAttr.ShortName; } else if (!dpAttr.Name.IsNullOrWhiteSpace()) { obj.FieldName = dpAttr.Name; } } DisplayFormatAttribute dfAttr = pd.Attributes.OfType <DisplayFormatAttribute>().FirstOrDefault(); if (dfAttr != null && !dfAttr.DataFormatString.IsNullOrWhiteSpace()) { obj.FormatText = dfAttr.DataFormatString; } if (dfAttr != null && !dfAttr.NullDisplayText.IsNullOrWhiteSpace()) { obj.NullValue = dfAttr.NullDisplayText; } if (!CSVRecordFieldConfigurations.Any(c => c.Name == pd.Name)) { CSVRecordFieldConfigurations.Add(obj); } } } } } }
private void DiscoverRecordFields(Type recordType, ref int position, string declaringMember = null, bool optIn = false, PropertyDescriptor propDesc = null) { if (!recordType.IsDynamicType()) { Type pt = null; if (optIn) //ChoTypeDescriptor.GetProperties(recordType).Where(pd => pd.Attributes.OfType<ChoCSVRecordFieldAttribute>().Any()).Any()) { foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType)) { pt = pd.PropertyType.GetUnderlyingType(); if (!pt.IsSimple() && !typeof(IEnumerable).IsAssignableFrom(pt)) { DiscoverRecordFields(pt, ref position, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn); } else if (pd.Attributes.OfType <ChoCSVRecordFieldAttribute>().Any()) { var obj = new ChoCSVRecordFieldConfiguration(pd.Name, pd.Attributes.OfType <ChoCSVRecordFieldAttribute>().First(), pd.Attributes.OfType <Attribute>().ToArray()); obj.FieldType = pt; obj.PropertyDescriptor = pd; obj.DeclaringMember = declaringMember == null ? null : "{0}.{1}".FormatString(declaringMember, pd.Name); if (!CSVRecordFieldConfigurations.Any(c => c.Name == pd.Name)) { CSVRecordFieldConfigurations.Add(obj); } } } } else { if (typeof(IList).IsAssignableFrom(recordType) && !typeof(ArrayList).IsAssignableFrom(recordType) && !recordType.IsInterface) { if (propDesc != null) { RangeAttribute dnAttr = propDesc.Attributes.OfType <RangeAttribute>().FirstOrDefault(); if (dnAttr == null) { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, null, propDesc, null, declaringMember == null ? propDesc.GetDisplayName() : propDesc.GetDisplayName(String.Empty)); CSVRecordFieldConfigurations.Add(obj); } else if (dnAttr != null && dnAttr.Minimum.CastTo <int>() >= 0 && dnAttr.Maximum.CastTo <int>() > 0 && dnAttr.Minimum.CastTo <int>() <= dnAttr.Maximum.CastTo <int>()) { recordType = recordType.GetItemType().GetUnderlyingType(); if (recordType.IsSimple()) { for (int range = dnAttr.Minimum.CastTo <int>(); range <= dnAttr.Maximum.CastTo <int>(); range++) { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, null, propDesc, range); //if (!CSVRecordFieldConfigurations.Any(c => c.Name == (declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name)))) CSVRecordFieldConfigurations.Add(obj); } } else { for (int range = dnAttr.Minimum.CastTo <int>(); range <= dnAttr.Maximum.CastTo <int>(); range++) { foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType)) { pt = pd.PropertyType.GetUnderlyingType(); if (pt != typeof(object) && !pt.IsSimple() /*&& !typeof(IEnumerable).IsAssignableFrom(pt)*/) { //DiscoverRecordFields(pt, ref position, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn, pd); } else { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, declaringMember, pd, range, propDesc.GetDisplayName()); //if (!CSVRecordFieldConfigurations.Any(c => c.Name == (declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name)))) CSVRecordFieldConfigurations.Add(obj); } } } } } } } else if (recordType.IsGenericType && recordType.GetGenericTypeDefinition() == typeof(Dictionary <,>) /*&& typeof(string) == recordType.GetGenericArguments()[0]*/) { if (propDesc != null) { ChoDictionaryKeyAttribute[] dnAttrs = propDesc.Attributes.OfType <ChoDictionaryKeyAttribute>().ToArray(); if (dnAttrs.IsNullOrEmpty()) { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, null, propDesc, null, declaringMember == null ? propDesc.GetDisplayName() : propDesc.GetDisplayName(String.Empty)); CSVRecordFieldConfigurations.Add(obj); } else { var keys = (from a in dnAttrs where a != null && !a.Keys.IsNullOrWhiteSpace() select a.Keys.SplitNTrim()).SelectMany(a => a).ToArray(); foreach (var key in keys) { if (!key.IsNullOrWhiteSpace()) { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, null, propDesc, dictKey: key); //if (!CSVRecordFieldConfigurations.Any(c => c.Name == (declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name)))) CSVRecordFieldConfigurations.Add(obj); } } } } } else { if (recordType == typeof(object) //|| typeof(IEnumerable).IsAssignableFrom(recordType) //|| typeof(ICollection).IsAssignableFrom(recordType) ) { } else if (recordType.IsSimple()) { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, declaringMember, propDesc); if (!CSVRecordFieldConfigurations.Any(c => c.Name == propDesc.Name)) { CSVRecordFieldConfigurations.Add(obj); } } else { foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType)) { pt = pd.PropertyType.GetUnderlyingType(); if (pt == typeof(object) || typeof(ArrayList).IsAssignableFrom(pt) || typeof(Hashtable).IsAssignableFrom(pt) ) { continue; } if (pt != typeof(object) && !pt.IsSimple() /*&& !typeof(IEnumerable).IsAssignableFrom(pt)*/) { if (propDesc == null) { DiscoverRecordFields(pt, ref position, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn, pd); } else { DiscoverRecordFields(pt, ref position, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn, pd); } } else { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, declaringMember, pd, null, declaringMember == null ? propDesc.GetDisplayName() : propDesc.GetDisplayName(String.Empty)); if (!CSVRecordFieldConfigurations.Any(c => c.Name == (declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name)))) { CSVRecordFieldConfigurations.Add(obj); } } } } } } } }