internal protected virtual void SettingPropertyValue(SqlFieldSettingPropertyValueParameters parameters) { }
public static object CreateSqlEntity(Type type, DataRow dr, Action <object, PropertyInfo, object> setPropertyValue) { var e = Activator.CreateInstance(type, true); if (setPropertyValue == null) { setPropertyValue = (entity, pi, value) => { pi.SetValue(entity, value, null); }; } var properties = GetTypeSelectProperties(type); var fieldNamingType = GetSqlFieldNamingType(type); foreach (var pi in properties) { if (pi.HasCustomAttribute <SqlEntityAttribute>()) { var eChild = CreateSqlEntity(pi.PropertyType, dr, setPropertyValue); pi.SetValue(e, eChild, null); } else { //field var fieldName = GetFieldName(pi, fieldNamingType).Trim('"'); if (!dr.Table.Columns.Contains(fieldName)) { continue; } object value = null; try { value = dr[fieldName]; if (value is DBNull) { var defaultValueAttr = pi.GetCustomAttribute <SqlDefaultValueAttribute>(); value = defaultValueAttr != null ? defaultValueAttr.SelectValue : null; } var propertyType = Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType; if (value != null && propertyType.IsEnum) { value = Enum.Parse(propertyType, value.ToString()); } var attr = pi.GetCustomAttribute <SqlFieldAttribute>(); var settingParameters = new SqlFieldSettingPropertyValueParameters(type, pi, e, value); attr.SettingPropertyValue(settingParameters); if (!settingParameters.Cancel) { if (settingParameters.HasNewPropertyValue) { value = settingParameters.NewPropertyValue; if (value != null) { propertyType = value.GetType(); } } } if (value != null && !propertyType.IsEnum) { value = Convert.ChangeType(value, propertyType); } setPropertyValue(e, pi, value); } catch (Exception ex) { Log.Error(string.Format("Type '{2}': failed to set property '{0}' with value '{1}' ({3})", pi.Name, value, type.Name, value == null ? "null" : value.GetType().Name), ex); throw; } } } return(e); }