Пример #1
0
        internal void AutoMapColumnsAction <T>(params Expression <Func <T, object> >[] ignorePropertyExpressions)
        {
            VerifyAutoMapAlreadyCalled();

            var properties          = ObjectReflectionHelper.GetProperties(_data.Item.GetType());
            var ignorePropertyNames = new HashSet <string>();

            if (ignorePropertyExpressions != null)
            {
                foreach (var ignorePropertyExpression in ignorePropertyExpressions)
                {
                    var ignorePropertyName = new PropertyExpressionParser <T>(_data.Item, ignorePropertyExpression).Name;
                    ignorePropertyNames.Add(ignorePropertyName);
                }
            }

            foreach (var property in properties)
            {
                var ignoreProperty = ignorePropertyNames.SingleOrDefault(x => x.Equals(property.Value.Name, StringComparison.CurrentCultureIgnoreCase));
                if (ignoreProperty != null)
                {
                    continue;
                }

                var propertyType = ObjectReflectionHelper.GetPropertyType(property.Value);

                var propertyValue = ObjectReflectionHelper.GetPropertyValue(_data.Item, property.Value);
                ColumnAction(property.Value.Name, propertyValue, propertyType, DataTypes.Object, 0);
            }
        }
Пример #2
0
        private void SetPropertyValue(DataReaderField field, PropertyInfo property, object item, object value)
        {
            try
            {
                if (value == DBNull.Value)
                {
                    if (ObjectReflectionHelper.IsNullable(property))
                    {
                        value = null;
                    }
                    else
                    {
                        value = ObjectReflectionHelper.GetDefault(property.PropertyType);
                    }
                }
                else
                {
                    var propertyType = ObjectReflectionHelper.GetPropertyType(property);

                    if (propertyType != field.Type)
                    {
                        if (propertyType.IsEnum)
                        {
                            if (field.Type == typeof(string))
                            {
                                value = Enum.Parse(propertyType, (string)value, true);
                            }
                            else
                            {
                                value = Enum.ToObject(propertyType, value);
                            }
                        }
                        else if (!ObjectReflectionHelper.IsBasicClrType(propertyType))
                        {
                            return;
                        }
                        else if (propertyType == typeof(string))
                        {
                            value = value.ToString();
                        }
                        else
                        {
                            value = Convert.ChangeType(value, property.PropertyType);
                        }
                    }
                }

                property.SetValue(item, value, null);
            }
            catch (Exception exception)
            {
                throw new FluentDataException("Could not map: " + property.Name, exception);
            }
        }