//---------------------------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated by BLToolkit template for T4.
//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
// </auto-generated>
//---------------------------------------------------------------------------------------------------
using System;
using System.Data.SqlTypes;
using System.IO;
using System.Xml;

using Convert = BLToolkit.Common.Convert;
#if !SILVERLIGHT
using System.Xml.Linq;
#endif

namespace BLToolkit.Mapping
{
	public partial class MemberMapper
	{

		class SByteMapper : MemberMapper
		{
			SByte _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetSByte(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSByte(
					o,
					value is SByte ? (SByte)value :
					value == null ? _nullValue : MappingSchema.ConvertToSByte(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToSByte(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : SByteMapper
			{
				public override bool IsNull(object o) { return GetSByte(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetSByte(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class Int16Mapper : MemberMapper
		{
			Int16 _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetInt16(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetInt16(
					o,
					value is Int16 ? (Int16)value :
					value == null ? _nullValue : MappingSchema.ConvertToInt16(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToInt16(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : Int16Mapper
			{
				public override bool IsNull(object o) { return GetInt16(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetInt16(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class Int32Mapper : MemberMapper
		{
			Int32 _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetInt32(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetInt32(
					o,
					value is Int32 ? (Int32)value :
					value == null ? _nullValue : MappingSchema.ConvertToInt32(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToInt32(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : Int32Mapper
			{
				public override bool IsNull(object o) { return GetInt32(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetInt32(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class Int64Mapper : MemberMapper
		{
			Int64 _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetInt64(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetInt64(
					o,
					value is Int64 ? (Int64)value :
					value == null ? _nullValue : MappingSchema.ConvertToInt64(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToInt64(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : Int64Mapper
			{
				public override bool IsNull(object o) { return GetInt64(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetInt64(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class ByteMapper : MemberMapper
		{
			Byte _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetByte(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetByte(
					o,
					value is Byte ? (Byte)value :
					value == null ? _nullValue : MappingSchema.ConvertToByte(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToByte(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : ByteMapper
			{
				public override bool IsNull(object o) { return GetByte(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetByte(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class UInt16Mapper : MemberMapper
		{
			UInt16 _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetUInt16(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetUInt16(
					o,
					value is UInt16 ? (UInt16)value :
					value == null ? _nullValue : MappingSchema.ConvertToUInt16(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToUInt16(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : UInt16Mapper
			{
				public override bool IsNull(object o) { return GetUInt16(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetUInt16(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class UInt32Mapper : MemberMapper
		{
			UInt32 _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetUInt32(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetUInt32(
					o,
					value is UInt32 ? (UInt32)value :
					value == null ? _nullValue : MappingSchema.ConvertToUInt32(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToUInt32(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : UInt32Mapper
			{
				public override bool IsNull(object o) { return GetUInt32(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetUInt32(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class UInt64Mapper : MemberMapper
		{
			UInt64 _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetUInt64(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetUInt64(
					o,
					value is UInt64 ? (UInt64)value :
					value == null ? _nullValue : MappingSchema.ConvertToUInt64(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToUInt64(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : UInt64Mapper
			{
				public override bool IsNull(object o) { return GetUInt64(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetUInt64(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class SingleMapper : MemberMapper
		{
			Single _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetSingle(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSingle(
					o,
					value is Single ? (Single)value :
					value == null ? _nullValue : MappingSchema.ConvertToSingle(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToSingle(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : SingleMapper
			{
				public override bool IsNull(object o) { return GetSingle(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetSingle(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class DoubleMapper : MemberMapper
		{
			Double _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetDouble(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetDouble(
					o,
					value is Double ? (Double)value :
					value == null ? _nullValue : MappingSchema.ConvertToDouble(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToDouble(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : DoubleMapper
			{
				public override bool IsNull(object o) { return GetDouble(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetDouble(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class CharMapper : MemberMapper
		{
			Char _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetChar(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetChar(
					o,
					value is Char ? (Char)value :
					value == null ? _nullValue : MappingSchema.ConvertToChar(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToChar(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : CharMapper
			{
				public override bool IsNull(object o) { return GetChar(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetChar(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class BooleanMapper : MemberMapper
		{
			Boolean _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetBoolean(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetBoolean(
					o,
					value is Boolean ? (Boolean)value :
					value == null ? _nullValue : MappingSchema.ConvertToBoolean(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToBoolean(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : BooleanMapper
			{
				public override bool IsNull(object o) { return GetBoolean(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetBoolean(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class DateTimeMapper : MemberMapper
		{
			DateTime _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetDateTime(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetDateTime(
					o,
					value is DateTime ? (DateTime)value :
					value == null ? _nullValue : MappingSchema.ConvertToDateTime(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToDateTime(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : DateTimeMapper
			{
				public override bool IsNull(object o) { return GetDateTime(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetDateTime(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class DateTimeOffsetMapper : MemberMapper
		{
			DateTimeOffset _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetDateTimeOffset(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetDateTimeOffset(
					o,
					value is DateTimeOffset ? (DateTimeOffset)value :
					value == null ? _nullValue : MappingSchema.ConvertToDateTimeOffset(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToDateTimeOffset(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : DateTimeOffsetMapper
			{
				public override bool IsNull(object o) { return GetDateTimeOffset(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetDateTimeOffset(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class DecimalMapper : MemberMapper
		{
			Decimal _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetDecimal(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetDecimal(
					o,
					value is Decimal ? (Decimal)value :
					value == null ? _nullValue : MappingSchema.ConvertToDecimal(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				_nullValue = Convert.ToDecimal(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : DecimalMapper
			{
				public override bool IsNull(object o) { return GetDecimal(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetDecimal(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class GuidMapper : MemberMapper
		{
			Guid _nullValue;

			public override bool IsNull (object o) { return false; }
			public override void SetNull(object o) { MemberAccessor.SetGuid(o, _nullValue); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetGuid(
					o,
					value is Guid ? (Guid)value :
					value == null ? _nullValue : MappingSchema.ConvertToGuid(value));
			}

			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 class Nullable : GuidMapper
			{
				public override bool IsNull(object o) { return GetGuid(o) == _nullValue; }

				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetGuid(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class StreamMapper : MemberMapper
		{
			Stream _nullValue;

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetValue(
					o,
					value is Stream ? value :
					value == null ? _nullValue : MappingSchema.ConvertToStream(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				if (mapMemberInfo.NullValue != null)
					_nullValue = mapMemberInfo.MappingSchema.ConvertToStream(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : StreamMapper
			{
				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetValue(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class NullableSByteMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableSByte(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableSByte(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableSByte(
					o, value == null || value is SByte? (SByte?)value: MappingSchema.ConvertToNullableSByte(value));
			}

			public class Enum : NullableEnumMapper
			{
				public override void SetValue(object o, object value)
				{
					if (value != null)
					{
						var valueType = value.GetType();
						
						if (valueType != MemberType)
						{
							if (valueType != UnderlyingType)
								value = MappingSchema.ConvertToNullableSByte(value);

							value = System.Enum.ToObject(MemberType, (SByte)value);
						}
					}

					MemberAccessor.SetValue(o, value);
				}
			}
		}

		class NullableInt16Mapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableInt16(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableInt16(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableInt16(
					o, value == null || value is Int16? (Int16?)value: MappingSchema.ConvertToNullableInt16(value));
			}

			public class Enum : NullableEnumMapper
			{
				public override void SetValue(object o, object value)
				{
					if (value != null)
					{
						var valueType = value.GetType();
						
						if (valueType != MemberType)
						{
							if (valueType != UnderlyingType)
								value = MappingSchema.ConvertToNullableInt16(value);

							value = System.Enum.ToObject(MemberType, (Int16)value);
						}
					}

					MemberAccessor.SetValue(o, value);
				}
			}
		}

		class NullableInt32Mapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableInt32(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableInt32(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableInt32(
					o, value == null || value is Int32? (Int32?)value: MappingSchema.ConvertToNullableInt32(value));
			}

			public class Enum : NullableEnumMapper
			{
				public override void SetValue(object o, object value)
				{
					if (value != null)
					{
						var valueType = value.GetType();
						
						if (valueType != MemberType)
						{
							if (valueType != UnderlyingType)
								value = MappingSchema.ConvertToNullableInt32(value);

							value = System.Enum.ToObject(MemberType, (Int32)value);
						}
					}

					MemberAccessor.SetValue(o, value);
				}
			}
		}

		class NullableInt64Mapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableInt64(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableInt64(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableInt64(
					o, value == null || value is Int64? (Int64?)value: MappingSchema.ConvertToNullableInt64(value));
			}

			public class Enum : NullableEnumMapper
			{
				public override void SetValue(object o, object value)
				{
					if (value != null)
					{
						var valueType = value.GetType();
						
						if (valueType != MemberType)
						{
							if (valueType != UnderlyingType)
								value = MappingSchema.ConvertToNullableInt64(value);

							value = System.Enum.ToObject(MemberType, (Int64)value);
						}
					}

					MemberAccessor.SetValue(o, value);
				}
			}
		}

		class NullableByteMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableByte(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableByte(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableByte(
					o, value == null || value is Byte? (Byte?)value: MappingSchema.ConvertToNullableByte(value));
			}

			public class Enum : NullableEnumMapper
			{
				public override void SetValue(object o, object value)
				{
					if (value != null)
					{
						var valueType = value.GetType();
						
						if (valueType != MemberType)
						{
							if (valueType != UnderlyingType)
								value = MappingSchema.ConvertToNullableByte(value);

							value = System.Enum.ToObject(MemberType, (Byte)value);
						}
					}

					MemberAccessor.SetValue(o, value);
				}
			}
		}

		class NullableUInt16Mapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableUInt16(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableUInt16(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableUInt16(
					o, value == null || value is UInt16? (UInt16?)value: MappingSchema.ConvertToNullableUInt16(value));
			}

			public class Enum : NullableEnumMapper
			{
				public override void SetValue(object o, object value)
				{
					if (value != null)
					{
						var valueType = value.GetType();
						
						if (valueType != MemberType)
						{
							if (valueType != UnderlyingType)
								value = MappingSchema.ConvertToNullableUInt16(value);

							value = System.Enum.ToObject(MemberType, (UInt16)value);
						}
					}

					MemberAccessor.SetValue(o, value);
				}
			}
		}

		class NullableUInt32Mapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableUInt32(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableUInt32(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableUInt32(
					o, value == null || value is UInt32? (UInt32?)value: MappingSchema.ConvertToNullableUInt32(value));
			}

			public class Enum : NullableEnumMapper
			{
				public override void SetValue(object o, object value)
				{
					if (value != null)
					{
						var valueType = value.GetType();
						
						if (valueType != MemberType)
						{
							if (valueType != UnderlyingType)
								value = MappingSchema.ConvertToNullableUInt32(value);

							value = System.Enum.ToObject(MemberType, (UInt32)value);
						}
					}

					MemberAccessor.SetValue(o, value);
				}
			}
		}

		class NullableUInt64Mapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableUInt64(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableUInt64(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableUInt64(
					o, value == null || value is UInt64? (UInt64?)value: MappingSchema.ConvertToNullableUInt64(value));
			}

			public class Enum : NullableEnumMapper
			{
				public override void SetValue(object o, object value)
				{
					if (value != null)
					{
						var valueType = value.GetType();
						
						if (valueType != MemberType)
						{
							if (valueType != UnderlyingType)
								value = MappingSchema.ConvertToNullableUInt64(value);

							value = System.Enum.ToObject(MemberType, (UInt64)value);
						}
					}

					MemberAccessor.SetValue(o, value);
				}
			}
		}

		class NullableCharMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableChar(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableChar(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableChar(
					o, value == null || value is Char? (Char?)value: MappingSchema.ConvertToNullableChar(value));
			}
		}

		class NullableDoubleMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableDouble(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableDouble(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableDouble(
					o, value == null || value is Double? (Double?)value: MappingSchema.ConvertToNullableDouble(value));
			}
		}

		class NullableSingleMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableSingle(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableSingle(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableSingle(
					o, value == null || value is Single? (Single?)value: MappingSchema.ConvertToNullableSingle(value));
			}
		}

		class NullableBooleanMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableBoolean(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableBoolean(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableBoolean(
					o, value == null || value is Boolean? (Boolean?)value: MappingSchema.ConvertToNullableBoolean(value));
			}
		}

		class NullableDateTimeMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableDateTime(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableDateTime(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableDateTime(
					o, value == null || value is DateTime? (DateTime?)value: MappingSchema.ConvertToNullableDateTime(value));
			}
		}

		class NullableDecimalMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableDecimal(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableDecimal(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableDecimal(
					o, value == null || value is Decimal? (Decimal?)value: MappingSchema.ConvertToNullableDecimal(value));
			}
		}

		class NullableGuidMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetNullableGuid(o) == null; }
			public override void SetNull(object o) { MemberAccessor.SetNullableGuid(o, null); }

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetNullableGuid(
					o, value == null || value is Guid? (Guid?)value: MappingSchema.ConvertToNullableGuid(value));
			}
		}

#if !SILVERLIGHT

		class XmlReaderMapper : MemberMapper
		{
			XmlReader _nullValue;

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetValue(
					o,
					value is XmlReader ? value :
					value == null ? _nullValue : MappingSchema.ConvertToXmlReader(value));
			}

			public override void Init(MapMemberInfo mapMemberInfo)
			{
				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

				if (mapMemberInfo.NullValue != null)
					_nullValue = mapMemberInfo.MappingSchema.ConvertToXmlReader(mapMemberInfo.NullValue);

				base.Init(mapMemberInfo);
			}

			public class Nullable : XmlReaderMapper
			{
				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetValue(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

		class XmlDocumentMapper : MemberMapper
		{
			XmlDocument _nullValue;

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetValue(
					o,
					value is XmlDocument ? value :
					value == null ? _nullValue : MappingSchema.ConvertToXmlDocument(value));
			}

			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 class Nullable : XmlDocumentMapper
			{
				public override object GetValue(object o)
				{
					var value = MemberAccessor.GetValue(o);
					return value == _nullValue ? null : (object)value;
				}
			}
		}

        class XElementMapper : MemberMapper
        {
            XElement _nullValue;

            public override void SetValue(object o, object value)
            {
                MemberAccessor.SetValue(
                    o,
                    value is XElement ? value :
                    value == null ? _nullValue : MappingSchema.ConvertToXElement(value));
            }

            public override void Init(MapMemberInfo mapMemberInfo)
            {
                if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");

                if (mapMemberInfo.NullValue != null)
                    _nullValue = mapMemberInfo.MappingSchema.ConvertToXElement(mapMemberInfo.NullValue);

                base.Init(mapMemberInfo);
            }

            public class Nullable : XElementMapper
            {
                public override object GetValue(object o)
                {
                    var value = MemberAccessor.GetValue(o);
                    return value == _nullValue ? null : (object)value;
                }
            }
        }

		class SqlByteMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlByte(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlByte(o, SqlByte.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlByte(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlByte(
					o, value is SqlByte? (SqlByte)value: MappingSchema.ConvertToSqlByte(value));
			}

			public class Default : SqlByteMapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

		class SqlInt16Mapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlInt16(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlInt16(o, SqlInt16.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlInt16(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlInt16(
					o, value is SqlInt16? (SqlInt16)value: MappingSchema.ConvertToSqlInt16(value));
			}

			public class Default : SqlInt16Mapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

		class SqlInt32Mapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlInt32(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlInt32(o, SqlInt32.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlInt32(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlInt32(
					o, value is SqlInt32? (SqlInt32)value: MappingSchema.ConvertToSqlInt32(value));
			}

			public class Default : SqlInt32Mapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

		class SqlInt64Mapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlInt64(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlInt64(o, SqlInt64.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlInt64(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlInt64(
					o, value is SqlInt64? (SqlInt64)value: MappingSchema.ConvertToSqlInt64(value));
			}

			public class Default : SqlInt64Mapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

		class SqlSingleMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlSingle(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlSingle(o, SqlSingle.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlSingle(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlSingle(
					o, value is SqlSingle? (SqlSingle)value: MappingSchema.ConvertToSqlSingle(value));
			}

			public class Default : SqlSingleMapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

		class SqlBooleanMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlBoolean(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlBoolean(o, SqlBoolean.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlBoolean(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlBoolean(
					o, value is SqlBoolean? (SqlBoolean)value: MappingSchema.ConvertToSqlBoolean(value));
			}

			public class Default : SqlBooleanMapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

		class SqlDoubleMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlDouble(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlDouble(o, SqlDouble.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlDouble(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlDouble(
					o, value is SqlDouble? (SqlDouble)value: MappingSchema.ConvertToSqlDouble(value));
			}

			public class Default : SqlDoubleMapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

		class SqlDateTimeMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlDateTime(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlDateTime(o, SqlDateTime.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlDateTime(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlDateTime(
					o, value is SqlDateTime? (SqlDateTime)value: MappingSchema.ConvertToSqlDateTime(value));
			}

			public class Default : SqlDateTimeMapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

		class SqlDecimalMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlDecimal(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlDecimal(o, SqlDecimal.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlDecimal(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlDecimal(
					o, value is SqlDecimal? (SqlDecimal)value: MappingSchema.ConvertToSqlDecimal(value));
			}

			public class Default : SqlDecimalMapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

		class SqlMoneyMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlMoney(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlMoney(o, SqlMoney.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlMoney(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlMoney(
					o, value is SqlMoney? (SqlMoney)value: MappingSchema.ConvertToSqlMoney(value));
			}

			public class Default : SqlMoneyMapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

		class SqlGuidMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlGuid(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlGuid(o, SqlGuid.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlGuid(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlGuid(
					o, value is SqlGuid? (SqlGuid)value: MappingSchema.ConvertToSqlGuid(value));
			}

			public class Default : SqlGuidMapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

		class SqlStringMapper : MemberMapper
		{
			public override bool IsNull (object o) { return GetSqlString(o).IsNull; }
			public override void SetNull(object o) { MemberAccessor.SetSqlString(o, SqlString.Null); }

			public override object GetValue(object o)
			{
				var value = MemberAccessor.GetSqlString(o);
				return value.IsNull? null: (object)value.Value;
			}

			public override void SetValue(object o, object value)
			{
				MemberAccessor.SetSqlString(
					o, value is SqlString? (SqlString)value: MappingSchema.ConvertToSqlString(value));
			}

			public class Default : SqlStringMapper
			{
				public override bool SupportsValue { get { return false; } }

				public override object GetValue(object o)
				{
					return MapTo(base.GetValue(o));
				}

				public override void SetValue(object o, object value)
				{
					base.SetValue(o, MapFrom(value));
				}
			}
		}

#endif
	}
}

