コード例 #1
0
ファイル: MemberMapper.cs プロジェクト: devmlog/bltoolkit
		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();
		}
コード例 #2
0
			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToInt16(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}
コード例 #3
0
ファイル: ObjectMapper.cs プロジェクト: epdumitru/mysqlib
        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);
        }
コード例 #4
0
ファイル: MemberMapper.cs プロジェクト: epdumitru/mysqlib
		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;
		}
コード例 #5
0
ファイル: MemberMapper.cs プロジェクト: MozgC/bltoolkit
		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);
		}
コード例 #6
0
ファイル: MemberMapper.cs プロジェクト: epdumitru/mysqlib
		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;
		}
コード例 #7
0
ファイル: MemberMapper.cs プロジェクト: MozgC/bltoolkit
		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;
		}
コード例 #8
0
ファイル: MemberMapper.cs プロジェクト: MozgC/bltoolkit
		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;
		}
コード例 #9
0
ファイル: MemberMapper.cs プロジェクト: MozgC/bltoolkit
			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);
			}
コード例 #10
0
ファイル: MemberMapper.cs プロジェクト: MozgC/bltoolkit
		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();
		}
コード例 #11
0
ファイル: MemberMapper.cs プロジェクト: MozgC/bltoolkit
		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;
		}
コード例 #12
0
        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);
        }
コード例 #13
0
ファイル: MemberMapper.cs プロジェクト: MozgC/bltoolkit
			public override void Init(MapMemberInfo mapMemberInfo)
			{
				base.Init(mapMemberInfo);

				var attr = MemberAccessor.GetAttribute<NoInstanceAttribute>();

				if (attr != null)
				{
					_createInstance = true;
				}
			}
コード例 #14
0
ファイル: ObjectMapper.cs プロジェクト: x64/bltoolkit
        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);
            }
        }
コード例 #15
0
ファイル: MemberMapper.cs プロジェクト: devmlog/bltoolkit
		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;
		}
コード例 #16
0
ファイル: MemberMapper.cs プロジェクト: MozgC/bltoolkit
		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;
		}
コード例 #17
0
			public override void Init(MapMemberInfo mapMemberInfo)
			{
				mapMemberInfo.DbType = DbType.AnsiString;
				base.Init(mapMemberInfo);
			}
コード例 #18
0
ファイル: MemberMapper.cs プロジェクト: epdumitru/mysqlib
			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);
			}
コード例 #19
0
ファイル: MemberMapper.cs プロジェクト: epdumitru/mysqlib
			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);
			}
コード例 #20
0
        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);
        }
コード例 #21
0
ファイル: ObjectMapper.cs プロジェクト: epdumitru/mysqlib
        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);
        }
コード例 #22
0
ファイル: ObjectMapper.cs プロジェクト: epdumitru/mysqlib
        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);
        }
コード例 #23
0
ファイル: MemberMapper.cs プロジェクト: MozgC/bltoolkit
		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;
		}
コード例 #24
0
				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);
				}