internal protected virtual void SettingPropertyValue(SqlFieldSettingPropertyValueParameters parameters)
 {
 }
Beispiel #2
0
    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);
    }