private void Initialize() { try { if (!Monitor.TryEnter(_padLock, 1 * 1000)) { return; } IDictionary <string, object> kvpDict = null; if (_func != null) { kvpDict = _func(); } else { kvpDict = Seed(); } if (kvpDict == null) { return; } IDictionary <string, object> mkvpDict = _kvpDict; bool hasDiff = mkvpDict == null || kvpDict.Except(mkvpDict).Concat(mkvpDict.Except(kvpDict)).Any(); if (!hasDiff) { return; } _kvpDict = kvpDict; ChoPropertyAttribute attr = null; object memberValue = null; string propName = null; //scan through members and load them foreach (var prop in ChoType.GetMembers(GetType()).Where(m => m.GetCustomAttribute <ChoIgnoreMemberAttribute>() != null && !ChoType.IsReadOnlyMember(m))) { attr = ChoType.GetMemberAttribute <ChoPropertyAttribute>(prop); try { SetDefaultValue(prop, true); propName = attr != null && !attr.Name.IsNullOrWhiteSpace() ? attr.Name : prop.Name; if (kvpDict.ContainsKey(propName)) { memberValue = AfterKVPLoaded(prop.Name, kvpDict[propName]); } else { memberValue = AfterKVPLoaded(prop.Name, null); } if (memberValue != null && memberValue is string) { string mv = memberValue as string; if (attr != null) { switch (attr.TrimOption) { case ChoPropertyValueTrimOption.Trim: mv = mv.Trim(); break; case ChoPropertyValueTrimOption.TrimEnd: mv = mv.TrimEnd(); break; case ChoPropertyValueTrimOption.TrimStart: mv = mv.TrimStart(); break; } } memberValue = mv; } if (ChoType.GetMemberType(prop) == typeof(string)) { if (!((string)memberValue).IsNullOrEmpty()) { ChoType.ConvertNSetMemberValue(this, prop, memberValue); } } else { if (memberValue != null) { ChoType.ConvertNSetMemberValue(this, prop, memberValue); } } ChoValidator.ValidateFor(this, prop); } catch (Exception ex) { //ChoLog.Error("{0}: Error loading '{1}' property. {2}".FormatString(NName, prop.Name, ex.Message)); SetDefaultValue(prop, false); } } } catch (Exception outerEx) { //ChoLog.Error("{0}: Error loading options. {1}".FormatString(NName, outerEx.Message)); } finally { Monitor.Exit(_padLock); } }
private bool FillRecord(object rec, Tuple <int, string> pair) { int lineNo; string line; lineNo = pair.Item1; line = pair.Item2; string[] fieldValues = (from x in line.Split(Configuration.Delimiter, Configuration.StringSplitOptions, Configuration.QuoteChar) select x).ToArray(); if (Configuration.ColumnCountStrict) { if (fieldValues.Length != Configuration.CSVRecordFieldConfigurations.Count) { throw new ChoParserException("Incorrect number of field values found at line [{2}]. Expected [{0}] field values. Found [{1}] field values.".FormatString(Configuration.CSVRecordFieldConfigurations.Count, fieldValues.Length, pair.Item1)); } } Dictionary <string, string> fieldNameValues = ToFieldNameValues(fieldValues); ValidateLine(pair.Item1, fieldValues); object fieldValue = null; ChoCSVRecordFieldConfiguration fieldConfig = null; foreach (KeyValuePair <string, ChoCSVRecordFieldConfiguration> kvp in Configuration.RecordFieldConfigurationsDict) { fieldValue = null; fieldConfig = kvp.Value; if (Configuration.FileHeaderConfiguration.HasHeaderRecord) { if (fieldNameValues.ContainsKey(fieldConfig.FieldName)) { fieldValue = fieldNameValues[fieldConfig.FieldName]; } else if (Configuration.ColumnCountStrict) { throw new ChoParserException("No matching '{0}' field header found.".FormatString(fieldConfig.FieldName)); } } else { if (fieldConfig.FieldPosition - 1 < fieldValues.Length) { fieldValue = fieldValues[fieldConfig.FieldPosition - 1]; } else if (Configuration.ColumnCountStrict) { throw new ChoParserException("Missing field value for {0} [Position: {1}] field.".FormatString(fieldConfig.FieldName, fieldConfig.FieldPosition)); } } if (rec is ExpandoObject) { if (kvp.Value.FieldType == null) { kvp.Value.FieldType = typeof(string); } } else { if (ChoType.HasProperty(rec.GetType(), kvp.Key)) { kvp.Value.FieldType = ChoType.GetMemberType(rec.GetType(), kvp.Key); } else { kvp.Value.FieldType = typeof(string); } } fieldValue = CleanFieldValue(fieldConfig, kvp.Value.FieldType, fieldValue as string); if (!RaiseBeforeRecordFieldLoad(rec, pair.Item1, kvp.Key, ref fieldValue)) { return(false); } try { bool ignoreFieldValue = fieldConfig.IgnoreFieldValue(fieldValue); if (ignoreFieldValue) { fieldValue = null; } if (rec is ExpandoObject) { var dict = rec as IDictionary <string, Object>; dict.SetDefaultValue(kvp.Key, kvp.Value, Configuration.Culture); if (ignoreFieldValue) { dict.AddOrUpdate(kvp.Key, fieldValue); } else { dict.ConvertNSetMemberValue(kvp.Key, kvp.Value, ref fieldValue, Configuration.Culture); } dict.DoMemberLevelValidation(kvp.Key, kvp.Value, Configuration.ObjectValidationMode); } else { if (ChoType.HasProperty(rec.GetType(), kvp.Key)) { rec.SetDefaultValue(kvp.Key, kvp.Value, Configuration.Culture); if (!ignoreFieldValue) { rec.ConvertNSetMemberValue(kvp.Key, kvp.Value, ref fieldValue, Configuration.Culture); } } else { throw new ChoMissingRecordFieldException("Missing '{0}' property in {1} type.".FormatString(kvp.Key, ChoType.GetTypeName(rec))); } rec.DoMemberLevelValidation(kvp.Key, kvp.Value, Configuration.ObjectValidationMode); } if (!RaiseAfterRecordFieldLoad(rec, pair.Item1, kvp.Key, fieldValue)) { return(false); } } catch (ChoParserException) { throw; } catch (ChoMissingRecordFieldException) { if (Configuration.ThrowAndStopOnMissingField) { throw; } } catch (Exception ex) { ChoETLFramework.HandleException(ex); if (fieldConfig.ErrorMode == ChoErrorMode.ThrowAndStop) { throw; } try { if (rec is ExpandoObject) { var dict = rec as IDictionary <string, Object>; if (dict.SetFallbackValue(kvp.Key, kvp.Value, Configuration.Culture, ref fieldValue)) { dict.DoMemberLevelValidation(kvp.Key, kvp.Value, Configuration.ObjectValidationMode); } else { throw new ChoParserException($"Failed to parse '{fieldValue}' value for '{fieldConfig.FieldName}' field.", ex); } } else if (ChoType.HasProperty(rec.GetType(), kvp.Key) && rec.SetFallbackValue(kvp.Key, kvp.Value, Configuration.Culture)) { rec.DoMemberLevelValidation(kvp.Key, kvp.Value, Configuration.ObjectValidationMode); } else { throw new ChoParserException($"Failed to parse '{fieldValue}' value for '{fieldConfig.FieldName}' field.", ex); } } catch (Exception innerEx) { if (ex == innerEx.InnerException) { if (fieldConfig.ErrorMode == ChoErrorMode.IgnoreAndContinue) { continue; } else { if (!RaiseRecordFieldLoadError(rec, pair.Item1, kvp.Key, fieldValue, ex)) { throw new ChoParserException($"Failed to parse '{fieldValue}' value for '{fieldConfig.FieldName}' field.", ex); } } } else { throw new ChoParserException("Failed to assign '{0}' fallback value to '{1}' field.".FormatString(fieldValue, fieldConfig.FieldName), innerEx); } } } } return(true); }
public static object ConvertFrom(object value, MemberInfo memberInfo, object sourceObject = null, CultureInfo culture = null) { ChoGuard.ArgumentNotNull(memberInfo, "MemberInfo"); return(ChoConvert.ConvertFrom(value, ChoType.GetMemberType(memberInfo), sourceObject, ChoTypeDescriptor.GetTypeConverters(memberInfo), ChoTypeDescriptor.GetTypeConverterParams(memberInfo), culture, memberInfo.Name)); }
public static object ConvertFrom(object target, MemberInfo memberInfo, CultureInfo culture) { ChoGuard.ArgumentNotNull(target, "Target"); ChoGuard.ArgumentNotNull(memberInfo, "MemberInfo"); Type objType = null; if (target is Type) { objType = target as Type; target = null; } else { objType = target.GetType(); } if (target == null) { return(ChoConvert.ConvertFrom(target, ChoType.GetMemberValue(objType, memberInfo.Name), ChoType.GetMemberType(memberInfo), ChoTypeDescriptor.GetTypeConverters(memberInfo), ChoTypeDescriptor.GetTypeConverterParams(memberInfo), culture)); } else { return(ChoConvert.ConvertFrom(target, ChoType.GetMemberValue(target, memberInfo.Name), ChoType.GetMemberType(memberInfo), ChoTypeDescriptor.GetTypeConverters(memberInfo), ChoTypeDescriptor.GetTypeConverterParams(memberInfo), culture)); } }
public override bool TrySetMember(SetMemberBinder binder, object value) { MemberInfo memberInfo = ChoTypeMembersCache.GetMemberInfo(_type, binder.Name); if (memberInfo == null) { return(false); } try { object newConvertedValue = ChoConvert.ConvertFrom(_instance, value, ChoType.GetMemberType(memberInfo), ChoTypeDescriptor.GetTypeConverters(memberInfo), ChoTypeDescriptor.GetTypeConverterParams(memberInfo)); ChoType.SetMemberValue(_instance, memberInfo, newConvertedValue); } catch (ChoFatalApplicationException) { throw; } catch (Exception ex) { Trace.TraceError(ex.ToString()); return(false); } if (!(_instance is INotifyPropertyChanged)) { PropertyChangedEventHandler propertyChanged = PropertyChanged; if (propertyChanged != null) { propertyChanged(this, new PropertyChangedEventArgs(binder.Name)); } } return(true); }