示例#1
0
 public static Func <T, object> CreateGetMethod(PropertyInfo propertyInfo)
 {
     return(DynamicMethodBuilder <T, object> .CreateGetMethod(propertyInfo));
 }
示例#2
0
        public static bool Map(T model, IRow row, string[] validColumnNames, string prefixColumnName, ColumnNamePropertyMap columnNamePropertyMap, bool ignoreCase)
        {
            bool existData = false;

            Dictionary <string, string> columnMap          = new Dictionary <string, string>();
            Dictionary <string, bool>   validColumnNameMap = new Dictionary <string, bool>();

            if (validColumnNames != null)
            {
                foreach (string validColumnName in validColumnNames)
                {
                    validColumnNameMap[validColumnName] = true;
                }
            }

            foreach (PropertyInfo property in typeof(T).GetProperties())
            {
                if (!property.CanWrite)
                {
                    continue;
                }

                string columnName;

                if (!columnNamePropertyMap.TryGetColumnName <T>(property, out columnName))
                {
                    continue;
                }

                if (!string.IsNullOrEmpty(prefixColumnName))
                {
                    columnName = prefixColumnName + columnName;
                }

                Action <T, object> setter = DynamicMethodBuilder <T> .CreateSetMethod(property);

                object value;

                if (!row.TryGetValue(columnName, out value))
                {
                    if (ignoreCase)
                    {
                        foreach (string name in row.ColumnNames)
                        {
                            if (String.Compare(name, property.Name, true) == 0)
                            {
                                value = row[name];
                                break;
                            }
                        }
                    }
                    else
                    {
                        continue;
                    }
                }

                if (CanChangeType(value, property.PropertyType))
                {
                    if (value == DBNull.Value)
                    {
                        if (validColumnNameMap.ContainsKey(columnName))
                        {
                            validColumnNameMap[columnName] = false;
                        }
                    }
                    else
                    {
                        existData = true;
                        if (Nullable.GetUnderlyingType(property.PropertyType) != null)
                        {
                            object baseValue = Convert.ChangeType(value, property.PropertyType.GetGenericArguments()[0]);
                            setter(model, baseValue);
                        }
                        else
                        {
                            setter(model, Convert.ChangeType(value, property.PropertyType));
                        }
                    }
                }
            }

            if (validColumnNameMap.Count > 0 && validColumnNameMap.All(x => x.Value == false))
            {
                return(false);
            }
            else if (!existData)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }