internal static MemberMapper CreateMemberMapper(MapMemberInfo mi) { var type = mi.Type; var mm = null as MemberMapper; if (type.IsEnum && mi.DbType == DbType.String) mm = new EnumStringMapper(type); if (mm == null && (type.IsPrimitive || type.IsEnum)) mm = GetPrimitiveMemberMapper(mi); if (mm == null) { mm = GetNullableMemberMapper(mi); //if (mm != null) // mi.IsNullable = true; } if (mm == null) mm = GetSimpleMemberMapper(mi); #if !SILVERLIGHT if (mm == null) mm = GetSqlTypeMemberMapper(mi); #endif return mm ?? new DefaultMemberMapper(); }
public override void Init(MapMemberInfo mapMemberInfo) { if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo"); _nullValue = Convert.ToInt16(mapMemberInfo.NullValue); base.Init(mapMemberInfo); }
protected virtual MemberMapper CreateMemberMapper(MapMemberInfo mapMemberInfo) { if (mapMemberInfo == null) { throw new ArgumentNullException("mapMemberInfo"); } MemberMapper mm = null; MemberMapperAttribute attr = mapMemberInfo.MemberAccessor.GetAttribute <MemberMapperAttribute>(); if (attr == null) { object[] attrs = TypeHelper.GetAttributes(mapMemberInfo.Type, typeof(MemberMapperAttribute)); foreach (MemberMapperAttribute a in attrs) { if (a.MemberType == null) { mm = a.MemberMapper; break; } } } else { mm = attr.MemberMapper; } if (mm == null) { object[] attrs = TypeHelper.GetAttributes( mapMemberInfo.MemberAccessor.MemberInfo.DeclaringType, typeof(MemberMapperAttribute)); foreach (MemberMapperAttribute a in attrs) { if (a.MemberType == mapMemberInfo.Type) { mm = a.MemberMapper; break; } } } if (mm == null) { mm = MemberMapper.CreateMemberMapper(mapMemberInfo); } mm.Init(mapMemberInfo); return(mm); }
public virtual void Init(MapMemberInfo mapMemberInfo) { if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo"); _mapMemberInfo = mapMemberInfo; _name = mapMemberInfo.Name; _dbType = mapMemberInfo.DbType; _type = mapMemberInfo.Type; _memberName = mapMemberInfo.MemberName; _memberAccessor = mapMemberInfo.MemberAccessor; _complexMemberAccessor = mapMemberInfo.ComplexMemberAccessor; _mappingSchema = mapMemberInfo.MappingSchema; }
public virtual void Init(MapMemberInfo mapMemberInfo) { if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo"); MapMemberInfo = mapMemberInfo; Name = mapMemberInfo.Name; MemberName = mapMemberInfo.MemberName; Storage = mapMemberInfo.Storage; DbType = mapMemberInfo.DbType; _type = mapMemberInfo.Type; MemberAccessor = mapMemberInfo.MemberAccessor; _complexMemberAccessor = mapMemberInfo.ComplexMemberAccessor; MappingSchema = mapMemberInfo.MappingSchema; if (Storage != null) MemberAccessor = ExprMemberAccessor.GetMemberAccessor(MemberAccessor.TypeAccessor, Storage); }
internal static MemberMapper CreateMemberMapper(MapMemberInfo mi) { Type type = mi.Type; MemberMapper mm = null; if (type.IsPrimitive || type.IsEnum) mm = GetPrimitiveMemberMapper(mi); if (mm == null) { mm = GetNullableMemberMapper(mi); //if (mm != null) // mi.IsNullable = true; } if (mm == null) mm = GetSimpleMemberMapper(mi); if (mm == null) mm = GetSqlTypeMemberMapper(mi); if (mm == null) mm = new DefaultMemberMapper(); return mm; }
private static MemberMapper GetSqlTypeMemberMapper(MapMemberInfo mi) { var type = mi.Type; if (TypeHelper.IsSameOrParent(typeof(INullable), type) == false) return null; var d = mi.MapValues != null; if (type == typeof(SqlByte)) return d? new SqlByteMapper. Default(): new SqlByteMapper(); if (type == typeof(SqlInt16)) return d? new SqlInt16Mapper. Default(): new SqlInt16Mapper(); if (type == typeof(SqlInt32)) return d? new SqlInt32Mapper. Default(): new SqlInt32Mapper(); if (type == typeof(SqlInt64)) return d? new SqlInt64Mapper. Default(): new SqlInt64Mapper(); if (type == typeof(SqlSingle)) return d? new SqlSingleMapper. Default(): new SqlSingleMapper(); if (type == typeof(SqlBoolean)) return d? new SqlBooleanMapper. Default(): new SqlBooleanMapper(); if (type == typeof(SqlDouble)) return d? new SqlDoubleMapper. Default(): new SqlDoubleMapper(); if (type == typeof(SqlDateTime)) return d? new SqlDateTimeMapper.Default(): new SqlDateTimeMapper(); if (type == typeof(SqlDecimal)) return d? new SqlDecimalMapper. Default(): new SqlDecimalMapper(); if (type == typeof(SqlMoney)) return d? new SqlMoneyMapper. Default(): new SqlMoneyMapper(); if (type == typeof(SqlGuid)) return d? new SqlGuidMapper. Default(): new SqlGuidMapper(); if (type == typeof(SqlString)) return d? new SqlStringMapper. Default(): new SqlStringMapper(); return null; }
private static MemberMapper GetNullableMemberMapper(MapMemberInfo mi) { var type = mi.Type; if (type.IsGenericType == false || mi.MapValues != null) return null; var underlyingType = Nullable.GetUnderlyingType(type); if (underlyingType == null) return null; if (underlyingType.IsEnum) { underlyingType = Enum.GetUnderlyingType(underlyingType); if (underlyingType == typeof(SByte)) return new NullableSByteMapper. Enum(); if (underlyingType == typeof(Int16)) return new NullableInt16Mapper. Enum(); if (underlyingType == typeof(Int32)) return new NullableInt32Mapper. Enum(); if (underlyingType == typeof(Int64)) return new NullableInt64Mapper. Enum(); if (underlyingType == typeof(Byte)) return new NullableByteMapper. Enum(); if (underlyingType == typeof(UInt16)) return new NullableUInt16Mapper.Enum(); if (underlyingType == typeof(UInt32)) return new NullableUInt32Mapper.Enum(); if (underlyingType == typeof(UInt64)) return new NullableUInt64Mapper.Enum(); } else { if (underlyingType == typeof(SByte)) return new NullableSByteMapper(); if (underlyingType == typeof(Int16)) return new NullableInt16Mapper(); if (underlyingType == typeof(Int32)) return new NullableInt32Mapper(); if (underlyingType == typeof(Int64)) return new NullableInt64Mapper(); if (underlyingType == typeof(Byte)) return new NullableByteMapper(); if (underlyingType == typeof(UInt16)) return new NullableUInt16Mapper(); if (underlyingType == typeof(UInt32)) return new NullableUInt32Mapper(); if (underlyingType == typeof(UInt64)) return new NullableUInt64Mapper(); if (underlyingType == typeof(Char)) return new NullableCharMapper(); if (underlyingType == typeof(Single)) return new NullableSingleMapper(); if (underlyingType == typeof(Boolean)) return new NullableBooleanMapper(); if (underlyingType == typeof(Double)) return new NullableDoubleMapper(); if (underlyingType == typeof(DateTime)) return new NullableDateTimeMapper(); if (underlyingType == typeof(Decimal)) return new NullableDecimalMapper(); if (underlyingType == typeof(Guid)) return new NullableGuidMapper(); } return null; }
public override void Init(MapMemberInfo mapMemberInfo) { if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo"); MemberType = Nullable.GetUnderlyingType(mapMemberInfo.Type); UnderlyingType = mapMemberInfo.MemberAccessor.UnderlyingType; base.Init(mapMemberInfo); }
private static MemberMapper GetPrimitiveMemberMapper(MapMemberInfo mi) { if (mi.MapValues != null) return null; var n = mi.Nullable; var type = mi.MemberAccessor.UnderlyingType; if (type == typeof(SByte)) return n? new SByteMapper. Nullable(): new SByteMapper(); if (type == typeof(Int16)) return n? new Int16Mapper. Nullable(): new Int16Mapper(); if (type == typeof(Int32)) return n? new Int32Mapper. Nullable(): new Int32Mapper(); if (type == typeof(Int64)) return n? new Int64Mapper. Nullable(): new Int64Mapper(); if (type == typeof(Byte)) return n? new ByteMapper. Nullable(): new ByteMapper(); if (type == typeof(UInt16)) return n? new UInt16Mapper. Nullable(): new UInt16Mapper(); if (type == typeof(UInt32)) return n? new UInt32Mapper. Nullable(): new UInt32Mapper(); if (type == typeof(UInt64)) return n? new UInt64Mapper. Nullable(): new UInt64Mapper(); if (type == typeof(Single)) return n? new SingleMapper. Nullable(): new SingleMapper(); if (type == typeof(Double)) return n? new DoubleMapper. Nullable(): new DoubleMapper(); if (type == typeof(Char)) return n? new CharMapper. Nullable(): new CharMapper(); if (type == typeof(Boolean)) return n? new BooleanMapper.Nullable(): new BooleanMapper(); throw new InvalidOperationException(); }
private static MemberMapper GetSimpleMemberMapper(MapMemberInfo mi) { if (mi.MapValues != null) return null; var n = mi.Nullable; var type = mi.Type; if (type == typeof(String)) if (mi.Trimmable) return n? new StringMapper.Trimmable.NullableT(): new StringMapper.Trimmable(); else return n? new StringMapper.Nullable() : new StringMapper(); if (type == typeof(DateTime)) return n? new DateTimeMapper.Nullable() : new DateTimeMapper(); if (type == typeof(DateTimeOffset)) return n? new DateTimeOffsetMapper.Nullable() : new DateTimeOffsetMapper(); if (type == typeof(Decimal)) return n? new DecimalMapper.Nullable() : new DecimalMapper(); if (type == typeof(Guid)) return n? new GuidMapper.Nullable() : new GuidMapper(); if (type == typeof(Stream)) return n? new StreamMapper.Nullable() : new StreamMapper(); #if !SILVERLIGHT if (type == typeof(XmlReader)) return n? new XmlReaderMapper.Nullable() : new XmlReaderMapper(); if (type == typeof(XmlDocument)) return n? new XmlDocumentMapper.Nullable() : new XmlDocumentMapper(); #endif return null; }
protected virtual MemberMapper CreateMemberMapper(MapMemberInfo mapMemberInfo) { if (mapMemberInfo == null) { throw new ArgumentNullException("mapMemberInfo"); } MemberMapper mm = null; var attr = mapMemberInfo.MemberAccessor.GetAttribute <MemberMapperAttribute>(); MemberExtension ext; if (_extension != null && _extension.Members.TryGetValue(mapMemberInfo.MemberName, out ext)) { AttributeExtensionCollection attrExt; if (ext.Attributes.TryGetValue("MemberMapper", out attrExt)) { attr = new MemberMapperAttribute((Type)attrExt[0].Values["MemberMapperType"]); } } if (attr == null) { var attrs = TypeHelper.GetAttributes(mapMemberInfo.Type, typeof(MemberMapperAttribute)); foreach (MemberMapperAttribute a in attrs) { if (a.MemberType == null) { mm = a.MemberMapper; break; } } } else { mm = attr.MemberMapper; } if (mm == null) { var attrs = TypeHelper.GetAttributes( mapMemberInfo.MemberAccessor.MemberInfo.DeclaringType, typeof(MemberMapperAttribute)); foreach (MemberMapperAttribute a in attrs) { if (a.MemberType == mapMemberInfo.Type) { mm = a.MemberMapper; break; } } } if (mm == null) { mm = MemberMapper.CreateMemberMapper(mapMemberInfo); } mm.Init(mapMemberInfo); return(mm); }
public override void Init(MapMemberInfo mapMemberInfo) { base.Init(mapMemberInfo); var attr = MemberAccessor.GetAttribute<NoInstanceAttribute>(); if (attr != null) { _createInstance = true; } }
protected MemberMapper GetComplexMapper(string mapName, string origName) { if (origName == null) { throw new ArgumentNullException("origName"); } var name = origName.ToLower(); var idx = origName.IndexOf('.'); lock (_nameToComplexMapper) { MemberMapper mm; if (_nameToComplexMapper.TryGetValue(name, out mm)) { return(mm); } if (idx > 0) { name = name.Substring(0, idx); foreach (MemberAccessor ma in TypeAccessor) { if (ma.Name.Length == name.Length && ma.Name.ToLower() == name) { var om = MappingSchema.GetObjectMapper(ma.Type); if (om != null) { mm = om.GetComplexMapper(mapName, origName.Substring(idx + 1)); if (mm != null) { var mi = new MapMemberInfo { MemberAccessor = ma, ComplexMemberAccessor = mm.ComplexMemberAccessor, Type = mm.Type, MappingSchema = MappingSchema, Name = mapName, MemberName = origName }; var mapper = new MemberMapper.ComplexMapper(mm); var key = origName.ToLower(); mapper.Init(mi); if (_nameToComplexMapper.ContainsKey(key)) { _nameToComplexMapper[key] = mapper; } else { _nameToComplexMapper.Add(key, mapper); } return(mapper); } } break; } } } else { foreach (var m in _members) { if (m.MemberAccessor.Name.Length == name.Length && m.MemberAccessor.Name.ToLower() == name) { if (_nameToComplexMapper.ContainsKey(name)) { _nameToComplexMapper[name] = m; } else { _nameToComplexMapper.Add(name, m); } return(m); } } } // Under some conditions, this way lead to memory leaks. // In other hand, shaking mappers up every time lead to performance loss. // So we cache failed requests. // If this optimization is a memory leak for you, just comment out next line. // if (_nameToComplexMapper.ContainsKey(name)) { _nameToComplexMapper[name] = null; } else { _nameToComplexMapper.Add(name, null); } return(null); } }
protected static object MapTo(object value, MapMemberInfo mapInfo) { if (mapInfo == null) throw new ArgumentNullException("mapInfo"); if (value == null) return null; if (mapInfo.Nullable && mapInfo.NullValue != null) { try { var comp = (IComparable)value; if (comp.CompareTo(mapInfo.NullValue) == 0) return null; } catch { } } if (mapInfo.MapValues != null) { object mapValue; if (mapInfo.TryGetMapValue(value, out mapValue)) return mapValue; //2011-11-16 ili: this is too slow when we have for ex. enum with 50+ values // //var comp = (IComparable)value; //foreach (var mv in mapInfo.MapValues) //{ // try // { // if (comp.CompareTo(mv.OrigValue) == 0) // return mv.MapValues[0]; // } // catch // { // } //} } return value; }
protected object MapFrom(object value, MapMemberInfo mapInfo) { if (mapInfo == null) throw new ArgumentNullException("mapInfo"); if (value == null) return mapInfo.NullValue; if (mapInfo.Trimmable && value is string) value = value.ToString().TrimEnd(_trim); if (mapInfo.MapValues != null) { var comp = (IComparable)value; foreach (var mv in mapInfo.MapValues) foreach (var mapValue in mv.MapValues) { try { if (comp.CompareTo(mapValue) == 0) return mv.OrigValue; } catch { } } // Default value. // if (mapInfo.DefaultValue != null) return mapInfo.DefaultValue; } var valueType = value.GetType(); var memberType = mapInfo.Type; if (!TypeHelper.IsSameOrParent(memberType, valueType)) { if (memberType.IsGenericType) { var underlyingType = Nullable.GetUnderlyingType(memberType); if (valueType == underlyingType) return value; memberType = underlyingType; } if (memberType.IsEnum) { var underlyingType = mapInfo.MemberAccessor.UnderlyingType; if (valueType != underlyingType) //value = _mappingSchema.ConvertChangeType(value, underlyingType); return MapFrom(MappingSchema.ConvertChangeType(value, underlyingType), mapInfo); //value = Enum.Parse(type, Enum.GetName(type, value)); value = Enum.ToObject(memberType, value); } else { value = MappingSchema.ConvertChangeType(value, memberType); } } return value; }
public override void Init(MapMemberInfo mapMemberInfo) { mapMemberInfo.DbType = DbType.AnsiString; base.Init(mapMemberInfo); }
public override void Init(MapMemberInfo mapMemberInfo) { if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo"); if (mapMemberInfo.NullValue != null) _nullValue = mapMemberInfo.MappingSchema.ConvertToXmlDocument(mapMemberInfo.NullValue); base.Init(mapMemberInfo); }
public override void Init(MapMemberInfo mapMemberInfo) { if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo"); if (mapMemberInfo.NullValue != null) _nullValue = mapMemberInfo.NullValue is Guid? (Guid)mapMemberInfo.NullValue: new Guid(mapMemberInfo.NullValue.ToString()); base.Init(mapMemberInfo); }
public virtual void Init(MappingSchema mappingSchema, Type type) { if (type == null) { throw new ArgumentNullException("type"); } _typeAccessor = TypeAccessor.GetAccessor(type); _mappingSchema = mappingSchema; _extension = TypeExtension.GetTypeExtension(_typeAccessor.OriginalType, mappingSchema.Extensions); _inheritanceMapping.AddRange(GetInheritanceMapping()); foreach (MemberAccessor ma in _typeAccessor) { Association a = GetAssociation(ma); if (a != null) { _associations.Add(a); continue; } if (GetMapIgnore(ma)) { continue; } MapFieldAttribute mapFieldAttr = ma.GetAttribute <MapFieldAttribute>(); if (mapFieldAttr == null || (mapFieldAttr.OrigName == null && mapFieldAttr.Format == null)) { MapMemberInfo mi = new MapMemberInfo(); DbTypeAttribute dbTypeAttribute = ma.GetAttribute <DbTypeAttribute>(); if (dbTypeAttribute != null) { mi.DbType = dbTypeAttribute.DbType; mi.IsDbTypeSet = true; if (dbTypeAttribute.Size != null) { mi.DbSize = dbTypeAttribute.Size.Value; mi.IsDbSizeSet = true; } } mi.MemberAccessor = ma; mi.Type = ma.Type; mi.MappingSchema = mappingSchema; mi.MemberExtension = _extension[ma.Name]; mi.Name = GetFieldName(ma); mi.MemberName = ma.Name; mi.Storage = GetFieldStorage(ma); mi.IsInheritanceDiscriminator = GetInheritanceDiscriminator(ma); mi.Trimmable = GetTrimmable(ma); mi.SqlIgnore = GetSqlIgnore(ma); mi.MapValues = GetMapValues(ma); mi.DefaultValue = GetDefaultValue(ma); mi.Nullable = GetNullable(ma); mi.NullValue = GetNullValue(ma, mi.Nullable); Add(CreateMemberMapper(mi)); } else if (mapFieldAttr.OrigName != null) { EnsureMapper(mapFieldAttr.MapName, ma.Name + "." + mapFieldAttr.OrigName); } else if (mapFieldAttr.Format != null) { foreach (MemberMapper inner in _mappingSchema.GetObjectMapper(ma.Type)) { EnsureMapper(string.Format(mapFieldAttr.Format, inner.Name), ma.Name + "." + inner.MemberName); } } } foreach (AttributeExtension ae in _extension.Attributes["MapField"]) { string mapName = (string)ae["MapName"]; string origName = (string)ae["OrigName"]; if (mapName == null || origName == null) { throw new MappingException(string.Format( "Type '{0}' has invalid extension. MapField MapName='{1}' OrigName='{2}'.", type.FullName, mapName, origName)); } EnsureMapper(mapName, origName); } MetadataProvider.EnsureMapper(TypeAccessor, MappingSchema, EnsureMapper); }
protected MemberMapper GetComplexMapper(string mapName, string origName) { if (origName == null) { throw new ArgumentNullException("origName"); } string name = origName.ToLower(); int idx = origName.IndexOf('.'); if (idx > 0) { name = name.Substring(0, idx); foreach (MemberAccessor ma in TypeAccessor) { if (ma.Name.Length == name.Length && ma.Name.ToLower() == name) { ObjectMapper om = MappingSchema.GetObjectMapper(ma.Type); if (om != null) { MemberMapper mm = om.GetComplexMapper(mapName, origName.Substring(idx + 1)); if (mm != null) { MapMemberInfo mi = new MapMemberInfo(); mi.MemberAccessor = ma; mi.ComplexMemberAccessor = mm.ComplexMemberAccessor; mi.Type = mm.Type; mi.MappingSchema = MappingSchema; mi.Name = mapName; mi.MemberName = origName; MemberMapper mapper = new MemberMapper.ComplexMapper(mm); mapper.Init(mi); return(mapper); } } break; } } } else { MemberMapper mm = (MemberMapper)_nameToComplexMapper[name]; if (mm != null) { return(mm); } if (_nameToNotFoundComplexMappers.ContainsKey(name)) { return(null); } foreach (MemberMapper m in _members) { if (m.MemberAccessor.Name.Length == name.Length && m.MemberAccessor.Name.ToLower() == name) { _nameToComplexMapper[name] = m; return(m); } } // Under some conditions, this way lead to memory leaks. // In other hand, shaking mappers up every time lead to performance loss. // So we cache failed requests. // If this optimization is a memory leak for you, just comment out next line. // _nameToNotFoundComplexMappers.Add(name, null); } return(null); }
public virtual void Init(MappingSchema mappingSchema, Type type) { if (type == null) { throw new ArgumentNullException("type"); } _typeAccessor = TypeAccessor.GetAccessor(type); _mappingSchema = mappingSchema; _extension = TypeExtension.GetTypeExtension( _typeAccessor.OriginalType, mappingSchema.Extensions); foreach (MemberAccessor ma in _typeAccessor) { if (GetIgnore(ma)) { continue; } MapFieldAttribute mapFieldAttr = ma.GetAttribute <MapFieldAttribute>(); if (mapFieldAttr == null || (mapFieldAttr.OrigName == null && mapFieldAttr.Format == null)) { MapMemberInfo mi = new MapMemberInfo(); mi.MemberAccessor = ma; mi.Type = ma.Type; mi.MappingSchema = mappingSchema; mi.MemberExtension = _extension[ma.Name]; mi.Name = GetFieldName(ma); mi.MemberName = ma.Name; mi.Trimmable = GetTrimmable(ma); mi.MapValues = GetMapValues(ma); mi.DefaultValue = GetDefaultValue(ma); mi.Nullable = GetNullable(ma); mi.NullValue = GetNullValue(ma, mi.Nullable); Add(CreateMemberMapper(mi)); } else if (mapFieldAttr.OrigName != null) { EnsureMapper(mapFieldAttr.MapName, ma.Name + "." + mapFieldAttr.OrigName); } else if (mapFieldAttr.Format != null) { foreach (MemberMapper inner in _mappingSchema.GetObjectMapper(ma.Type)) { EnsureMapper(string.Format(mapFieldAttr.Format, inner.Name), ma.Name + "." + inner.MemberName); } } } foreach (AttributeExtension ae in _extension.Attributes["MapField"]) { string mapName = (string)ae["MapName"]; string origName = (string)ae["OrigName"]; if (mapName == null || origName == null) { throw new MappingException(string.Format( "Type '{0}' has invalid extension. MapField MapName='{1}' OrigName='{2}'.", type.FullName, mapName, origName)); } EnsureMapper(mapName, origName); } MetadataProvider.EnsureMapper(this, EnsureMapper); }
protected static object MapTo(object value, MapMemberInfo mapInfo) { if (mapInfo == null) throw new ArgumentNullException("mapInfo"); if (value == null) return null; if (mapInfo.Nullable && mapInfo.NullValue != null) { try { var comp = (IComparable)value; if (comp.CompareTo(mapInfo.NullValue) == 0) return null; } catch { } } if (mapInfo.MapValues != null) { var comp = (IComparable)value; foreach (var mv in mapInfo.MapValues) { try { if (comp.CompareTo(mv.OrigValue) == 0) return mv.MapValues[0]; } catch { } } } return value; }
protected override MemberMapper CreateMemberMapper(MapMemberInfo mapMemberInfo) { if (mapMemberInfo.Type == typeof(CustomString)) { MemberMapper mm = new CustomString.Mapper(); mm.Init(mapMemberInfo); return mm; } return base.CreateMemberMapper(mapMemberInfo); }