public ChoYamlRecordFieldConfiguration this[string name] { get { return(YamlRecordFieldConfigurations.Where(i => i.Name == name).FirstOrDefault()); } }
internal ChoYamlRecordFieldConfiguration GetFieldConfiguration(string fn) { fn = fn.NTrim(); if (!YamlRecordFieldConfigurations.Any(fc => fc.Name == fn)) { YamlRecordFieldConfigurations.Add(new ChoYamlRecordFieldConfiguration(fn, (string)null)); } return(YamlRecordFieldConfigurations.First(fc => fc.Name == fn)); }
public ChoYamlRecordConfiguration IgnoreField(string fieldName) { if (fieldName != null) { var fc = YamlRecordFieldConfigurations.Where(f => f.DeclaringMember == fieldName || f.FieldName == fieldName).FirstOrDefault(); if (fc != null) { YamlRecordFieldConfigurations.Remove(fc); } else { IgnoredFields.Add(fieldName); } } return(this); }
public ChoYamlRecordConfiguration IgnoreField <T, TProperty>(Expression <Func <T, TProperty> > field) { if (field != null) { if (YamlRecordFieldConfigurations.Count == 0) { MapRecordFields <T>(); } var fc = YamlRecordFieldConfigurations.Where(f => f.DeclaringMember == field.GetFullyQualifiedMemberName()).FirstOrDefault(); if (fc != null) { YamlRecordFieldConfigurations.Remove(fc); } } return(this); }
internal ChoYamlRecordFieldConfiguration GetFieldConfiguration(string propertyName, ChoYamlRecordFieldAttribute attr = null, Attribute[] otherAttrs = null, PropertyDescriptor pd = null, string fqm = null, Type subType = null) { if (subType != null) { MapRecordFieldsForType(subType); var fc = new ChoYamlRecordFieldConfiguration(propertyName, attr, otherAttrs); AddFieldForType(subType, fc); return(fc); } else { if (!YamlRecordFieldConfigurations.Any(fc => fc.Name == propertyName)) { YamlRecordFieldConfigurations.Add(new ChoYamlRecordFieldConfiguration(propertyName, attr, otherAttrs)); } return(YamlRecordFieldConfigurations.First(fc => fc.Name == propertyName)); } }
internal void WithField(string name, string YamlPath = null, Type fieldType = null, ChoFieldValueTrimOption fieldValueTrimOption = ChoFieldValueTrimOption.Trim, string fieldName = null, Func <object, object> valueConverter = null, Func <object, object> itemConverter = null, Func <object, object> customSerializer = null, object defaultValue = null, object fallbackValue = null, string fullyQualifiedMemberName = null, string formatText = null, bool isArray = true, string nullValue = null, Type recordType = null, Type subRecordType = null, Func <IDictionary <string, object>, Type> fieldTypeSelector = null) { ChoGuard.ArgumentNotNull(recordType, nameof(recordType)); if (!name.IsNullOrEmpty()) { if (subRecordType != null) { MapRecordFieldsForType(subRecordType); } string fnTrim = name.NTrim(); ChoYamlRecordFieldConfiguration fc = null; PropertyDescriptor pd = null; if (YamlRecordFieldConfigurations.Any(o => o.Name == fnTrim)) { fc = YamlRecordFieldConfigurations.Where(o => o.Name == fnTrim).First(); YamlRecordFieldConfigurations.Remove(fc); } else if (subRecordType != null) { pd = ChoTypeDescriptor.GetNestedProperty(subRecordType, fullyQualifiedMemberName.IsNullOrWhiteSpace() ? name : fullyQualifiedMemberName); } else { pd = ChoTypeDescriptor.GetNestedProperty(recordType, fullyQualifiedMemberName.IsNullOrWhiteSpace() ? name : fullyQualifiedMemberName); } var nfc = new ChoYamlRecordFieldConfiguration(fnTrim, YamlPath) { FieldType = fieldType, FieldValueTrimOption = fieldValueTrimOption, FieldName = fieldName.IsNullOrWhiteSpace() ? name : fieldName, ValueConverter = valueConverter, CustomSerializer = customSerializer, DefaultValue = defaultValue, FallbackValue = fallbackValue, FormatText = formatText, ItemConverter = itemConverter, IsArray = isArray, NullValue = nullValue, FieldTypeSelector = fieldTypeSelector, }; if (fullyQualifiedMemberName.IsNullOrWhiteSpace()) { nfc.PropertyDescriptor = fc != null ? fc.PropertyDescriptor : pd; nfc.DeclaringMember = fc != null ? fc.DeclaringMember : fullyQualifiedMemberName; } else { if (subRecordType == null) { pd = ChoTypeDescriptor.GetNestedProperty(recordType, fullyQualifiedMemberName); } else { pd = ChoTypeDescriptor.GetNestedProperty(subRecordType, fullyQualifiedMemberName); } nfc.PropertyDescriptor = pd; nfc.DeclaringMember = fullyQualifiedMemberName; } if (pd != null) { if (nfc.FieldType == null) { nfc.FieldType = pd.PropertyType; } } if (subRecordType == null) { YamlRecordFieldConfigurations.Add(nfc); } else { AddFieldForType(subRecordType, nfc); } } }
public ChoYamlRecordConfiguration ClearFields() { YamlRecordFieldConfigurationsForType.Clear(); YamlRecordFieldConfigurations.Clear(); return(this); }
public override void Validate(object state) { if (RecordType != null) { Init(RecordType); } base.Validate(state); string[] fieldNames = null; IDictionary <string, object> yamlNode = null; if (state is Tuple <long, IDictionary <string, object> > ) { yamlNode = ((Tuple <long, IDictionary <string, object> >)state).Item2; } else { fieldNames = state as string[]; } if (AutoDiscoverColumns && YamlRecordFieldConfigurations.Count == 0) { if (RecordType != null && !IsDynamicObject && /*&& RecordType != typeof(ExpandoObject)*/ ChoTypeDescriptor.GetProperties(RecordType).Where(pd => pd.Attributes.OfType <ChoYamlRecordFieldAttribute>().Any()).Any()) { MapRecordFields(RecordType); } else if (yamlNode != null) { Dictionary <string, ChoYamlRecordFieldConfiguration> dict = new Dictionary <string, ChoYamlRecordFieldConfiguration>(StringComparer.CurrentCultureIgnoreCase); foreach (var entry in yamlNode) { if (!dict.ContainsKey(entry.Key)) { dict.Add(entry.Key, new ChoYamlRecordFieldConfiguration(entry.Key, (string)null)); } else { throw new ChoRecordConfigurationException("Duplicate field(s) [Name(s): {0}] found.".FormatString(entry.Key)); } } foreach (ChoYamlRecordFieldConfiguration obj in dict.Values) { YamlRecordFieldConfigurations.Add(obj); } } else if (!fieldNames.IsNullOrEmpty()) { foreach (string fn in fieldNames) { if (IgnoredFields.Contains(fn)) { continue; } var obj = new ChoYamlRecordFieldConfiguration(fn, (string)null); YamlRecordFieldConfigurations.Add(obj); } } } else { foreach (var fc in YamlRecordFieldConfigurations) { fc.ComplexYamlPathUsed = !(fc.YamlPath.IsNullOrWhiteSpace() || String.Compare(fc.FieldName, fc.YamlPath, true) == 0); } } if (YamlRecordFieldConfigurations.Count <= 0) { throw new ChoRecordConfigurationException("No record fields specified."); } //Validate each record field foreach (var fieldConfig in YamlRecordFieldConfigurations) { fieldConfig.Validate(this); } //Check field position for duplicate string[] dupFields = YamlRecordFieldConfigurations.GroupBy(i => i.Name) .Where(g => g.Count() > 1) .Select(g => g.Key).ToArray(); if (dupFields.Length > 0) { throw new ChoRecordConfigurationException("Duplicate field(s) [Name(s): {0}] found.".FormatString(String.Join(",", dupFields))); } PIDict = new Dictionary <string, System.Reflection.PropertyInfo>(); PDDict = new Dictionary <string, PropertyDescriptor>(); foreach (var fc in YamlRecordFieldConfigurations) { var pd1 = fc.DeclaringMember.IsNullOrWhiteSpace() ? ChoTypeDescriptor.GetProperty(RecordType, fc.Name) : ChoTypeDescriptor.GetProperty(RecordType, fc.DeclaringMember); if (pd1 != null) { fc.PropertyDescriptor = pd1; } if (fc.PropertyDescriptor == null) { fc.PropertyDescriptor = TypeDescriptor.GetProperties(RecordType).AsTypedEnumerable <PropertyDescriptor>().Where(pd => pd.Name == fc.Name).FirstOrDefault(); } if (fc.PropertyDescriptor == null) { continue; } PIDict.Add(fc.Name, fc.PropertyDescriptor.ComponentType.GetProperty(fc.PropertyDescriptor.Name)); PDDict.Add(fc.Name, fc.PropertyDescriptor); } RecordFieldConfigurationsDict = YamlRecordFieldConfigurations.Where(i => !i.Name.IsNullOrWhiteSpace()).ToDictionary(i => i.Name); LoadNCacheMembers(YamlRecordFieldConfigurations); }
internal void Reset() { IsInitialized = false; YamlRecordFieldConfigurations.Clear(); }