Esempio n. 1
0
        public static IModelToTableMapper <T> GetModelMapperFromColumnDataAnnotation()
        {
            var modelPropertyInfosWithColumnAttribute = typeof(T)
                                                        .GetProperties(BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public)
                                                        .Where(x => CustomAttributeExtensions.IsDefined((MemberInfo)x, typeof(ColumnAttribute), false))
                                                        .ToArray();

            if (!modelPropertyInfosWithColumnAttribute.Any())
            {
                return(null);
            }

            var mapper = new ModelToTableMapper <T>();

            foreach (var propertyInfo in modelPropertyInfosWithColumnAttribute)
            {
                var attribute    = propertyInfo.GetCustomAttribute(typeof(ColumnAttribute));
                var dbColumnName = ((ColumnAttribute)attribute)?.Name;
                if (dbColumnName != null && mapper.GetMapping(dbColumnName) != null)
                {
                    throw new ModelToTableMapperException("Duplicate mapping for column " + dbColumnName);
                }

                mapper.AddMapping(propertyInfo, dbColumnName);
            }

            return(mapper);
        }
        internal virtual T MaterializeEntity(List <Message> messages, ModelToTableMapper <T> mapper)
        {
            var entity = (T)Activator.CreateInstance(typeof(T));

            foreach (var entityPropertyInfo in this.EntiyProperiesInfo)
            {
                var propertyMappedTo = mapper?.GetMapping(entityPropertyInfo);
                var columnName       = propertyMappedTo ?? entityPropertyInfo.Name;

                var message = messages.FirstOrDefault(m => string.Equals(m.Recipient, columnName, StringComparison.CurrentCultureIgnoreCase));
                if (message == default(Message))
                {
                    continue;
                }

                var dbColumnInfo = this.GetColumnInfo(columnName);

                var value = GetValue(entityPropertyInfo, dbColumnInfo, message.Body);
                entityPropertyInfo.SetValue(entity, value);
            }

            return(entity);
        }